1、类的基本思想:数据抽象、封装。数据抽象:分离接口(定义和声明用户能执行的操作)和实现(数据成员、接口函数体的实现)。
2、编译器先编译成员的声明,后编译成员函数体,无论这些成员出现的顺序。
3、this是指向类的指针,*this即类。
4、const
//函数isbn为const
//这里的const把this转换为常量指针,因为没有修改类的成员
string isbn() const {return bookNo;}
5、类的成员函数可以定义在类外
//这里My_class::表明函数属于类my_class
int My_class::func() const
{
......
}
6、构造函数:初始化类对象的成员,名字和类相同,没有返回值。构造函数可以在构造过程中向const对象写值,因为构造函数执行完,该对象才具有常量属性。
//:bookNo(s), units_sold(0),revenue(0),冒号后面为每个成员的初始化及bookNo=s...
//其它即函数体,Sales_data(const std::string &s){}
class Sales_data{
Sales_data()=default;//因为Sales_data有另一个构造函数,所有本函数是必须的
Sales_data(const std::string &s):bookNo(s), units_sold(0),revenue(0){}
}
7、访问控制和权限
struct和class都可以定义类,区别在于struct默认权限。struct默认public,class默认private(类的成员函数可以访问)
class My_class{
//friend 声明某些外部函数可以访问private成员
friend std::istream &read(std::istream&, Sales_data&);
public:
......
private:
.....
};
8、可变数据成员
mutable,永远不会是const,即使它是const对象的成员
mutable int a;
9、返回类
class Screen{
public:
Screen &set(char);
};
//这里inline (Screen &)Screen::set(char c)
//返回类型为引用即操作的是本身,而你不是拷贝类
//这就是返回类和类的引用的区别
inline Screen &Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
my_screen.move(4,0)返回类型为Screen &即类本身
Screen my_screen;
my_screen.move(4,0).set('#');
10、static
(1)静态成员函数不与任何对象绑定在一起(它属于类而非具体类的对象,但是可以通过对象.静态成员的方式访问),静态成员函数不能声明为const,而且不能在static函数体内使用this指针。
(2)在类的外部定义静态成员不能重复static关键字
(3)静态成员必须在类的外部定义和初始化每个静态成员,智能定义一次。类里面用static声明。
11、聚合类
只含有共有成员,没有类内初始化值,没有构造函数。成员可以用花括号初始化列表进行初始化。
12、
- 在创建对象之前,类中说明的数据成员并不占用内存空间。定义类时不能给数据成员赋值(除static成员)。
class A
{
int x = 0;//错
const double y = 0.0;//错
}
- 类中定义其他类对象(除类指针和引用外),定义的类必须有完整定义,只声明不行。
class A;//只声明不行
class B
{
A a;//错未见A定义
B b;//错B未定义完
//对
A *p1;
B *p2;
A &q1;
B &q2;
}
13、类的成员函数描述了类中定义的数据成员所能实施的操作。把成员函数的定义放在类中是建议编译程序按内联函数处理。类的每个对象的数据成员都有其对应的内存空间,类中成员函数只有一个空间。
14、成员初始化表中成员初始化的书写次序不决定它们的初始化次序,数据成员的初始化次序由它们在类中的声明次序来决定。当类中有常量数据成员和引用数据成员时,一定在构造函数的成员初始化表中对它们进行初始化。
class A
{
int x;
const int y;
int &z;
public:
A():x(0),z(x),y(1)//次序:x为0,y为1,z为x的引用
{
}
}
15、在创建一个对象时,用同类另一个对象对其初始化,需要调用拷贝构造函数。如果在类定义中没有给出拷贝构造函数,则编译程序将会为其提供一个隐式的拷贝构造函数,该拷贝构造函数的行为是逐个成员拷贝初始化。
//其中const可以省略,加上的目的是为了防止在函数中修改实参对象
<类名>(const <类名>&)
class A
{
public:
A();
A(const A& a);
}
三种情况会用到拷贝构造函数
- 定义对象时
A a1;
A a2(a1);//用到
- 把对象作为值参数传给函数
void f(A x);
A a;
f(a);//用到
- 把对象作为返回值时
A f()
{
A a;
return a;
}
C++类与对象详解
5248

被折叠的 条评论
为什么被折叠?



