667 字
3 分钟
08类注意事项
2025-02-14

成员变量默认用_开头#

不修改,尽量使用const引用类型#

在构造函数、成员函数、运算符重载s中,如果不会修改传递的参数,应当把形参定义为const引用类型。

拷贝构造函数#

在拷贝构造中,应当使用const引用类型.

如果不使用引用,在传递参数时会重复出发拷贝构造。

构造函数中,引用类型成员必须放在初始化列表中构造#

静态类型成员变量或者函数,需要单独定义#

移动构造的意义#

  1. 减少拷贝。
  2. 当类内成员,存在无法拷贝(没有拷贝构造函数)的对象时,只能使用移动构造函数。

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
}

默认拷贝构造与拷贝赋值#

系统会默认生成一个拷贝赋值运算符。该运算符按照成员声明的顺序,逐个拷贝每个成员变量。

  1. 逐个拷贝:默认拷贝构造函数会逐个拷贝所有的非静态成员变量。
  2. 指针成员:如果类中有指针成员,默认拷贝构造函数只会拷贝指针的值(地址),而不会拷贝指针所指向的对象。这可能会导致多个对象指向同一块内存,进而引发问题(如双重释放、内存泄漏等)。
  3. const引用成员:如果类中有const成员或引用成员,编译器不会生成默认的拷贝构造函数,因为这些成员不能被复制。
  4. 类中包含不可拷贝对象时,无法合成默认拷贝构造函数
08类注意事项
https://chrisnake11.github.io/blog/posts/coding/c基础/08类注意事项/
作者
Zheyv
发布于
2025-02-14
许可协议
CC BY-NC-SA 4.0