类定义的一般格式
class 类名 {
[private:]
私有数据成员和成员函数
public:
公有数据成员和成员函数
};
- 数据成员一般是私有的
- 成员函数一般是公有的
- 成员函数实现时分解出的小函数是私有的
this指针
每个成员函数都有一个隐藏的指向本类型的指针形参this,它指向当前调用成员函数的对象
如对函数
void create(int n, int d) { num = n; den = d;}
经过编译后,实际函数为
void create(int n, int d)
{ this->num = n; this->den = d;}
- 通常,在写成员函数时可以省略this,编译时会自动加上它们。
- 如果在成员函数中要把对象作为整体来访问时,必须显式地使用
this
指针。这种情况常出现在函数中返回一个对调用函数的对象的引用(如return * this;
)
必须在初始化列表中初始化的情况
- 数据成员不是普通的内置类型,而是某一个类的对象,可能无法直接用赋值语句在构造函数体中为它赋初值
- 类包含了一个常量的数据成员,常量只能在定义时对它初始化,而不能对它赋值。因此也必须放在初始化列表中
【BUG】如果类成员有指针,而拷贝的时候只拷贝了指针,则可能在一个对象析构时,导致其他对象的数据丢失。
拷贝构造函数的应用场合
- 对象用拷贝构造定义时,有两种情况,见下方。
Class obj1(args...);
//Type1
Class obj2 (obj1);
//Type 2
Class obj = Class(args...); //先构造临时对象,再拷贝构造obj对象
Class obj2 = obj1;
-
把对象作为参数传给函数时。注意如果是引用传递就没有这个过程。
-
把对象作为返回值时(与编译器有关,VS一定会用拷贝构造)。
对象的生命周期
-
创建顺序:遇到变量定义时调用构造函数。与普通的内置类型的变量完全相同。
-
消失顺序:
- 局部变量先消失,然后是静态局部变量, 最后是全局变量;
- 后创建的先消失。
网友评论