667 字
3 分钟
08类注意事项
成员变量默认用_开头
不修改,尽量使用const引用类型
在构造函数、成员函数、运算符重载s中,如果不会修改传递的参数,应当把形参定义为const引用类型。
拷贝构造函数
在拷贝构造中,应当使用const引用类型.
如果不使用引用,在传递参数时会重复出发拷贝构造。
构造函数中,引用类型成员必须放在初始化列表中构造
静态类型成员变量或者函数,需要单独定义
移动构造的意义
- 减少拷贝。
- 当类内成员,存在无法拷贝(没有拷贝构造函数)的对象时,只能使用移动构造函数。
static函数只能访问static变量
拷贝赋值运算符
注意:如果是自拷贝,直接返回。
Student& Student::operator=(const Student & student){ if(this != student){ this->name = student._name; *(_data) = *(student._data); // 深拷贝 ... } return *this;}
移动赋值运算符
Student& Student::operator=(Student && student) noexcept{ if(this != student){ this->name = std::move(student._name);
_data = new int(); (*_data) = std::move((*student._data)); // 移动(类似深拷贝) ... // 或者直接浅拷贝,要特别处理析构函数 _data = student._data; student._data = nullptr; // student析构函数需要处理nullptr情况。 } return *this;}
重载流输入输出运算符
流式输入输出运算符,需要两个参数,分别作用于std::ostream
类型和输入的数据上。
并且流式输入输出运算符,可以被递归调用,因此返回的仍然是std::ostream
类
流式输入输出运算符,不属于类的成员函数,因此需要声明为友元。
class Student{ ... // 声明为友元 friend std::ostream& operator<<(std::ostream& os, Student& student);};
// 在.cpp中实现std::ostream& operator<<(std::ostream& os, Student& student){ os << "student'name is " << student._name << std::endl; return os }
默认拷贝构造与拷贝赋值
系统会默认生成一个拷贝赋值运算符。该运算符按照成员声明的顺序,逐个拷贝每个成员变量。
- 逐个拷贝:默认拷贝构造函数会逐个拷贝所有的非静态成员变量。
- 指针成员:如果类中有指针成员,默认拷贝构造函数只会拷贝指针的值(地址),而不会拷贝指针所指向的对象。这可能会导致多个对象指向同一块内存,进而引发问题(如双重释放、内存泄漏等)。
const
和引用成员
:如果类中有const
成员或引用成员,编译器不会生成默认的拷贝构造函数,因为这些成员不能被复制。- 类中包含不可拷贝对象时,无法合成默认拷贝构造函数