C++ 类一
文章目录
- 1.类
- 1.访问控制说明符
- 2.成员函数
- 1. 构造函数
- 1.无参构造函数
- 2.拷贝构造函数
- 3.移动构造函数(C++11)
- 3.编译器生成的构造函数类型
- 1. 默认构造函数
- 2. 拷贝构造函数(浅拷贝)
- 3. 拷贝赋值运算符(浅拷贝)
- 4. 移动构造函数
- 5. 移动赋值运算符
- 6. 其他
- 4.析构函数
1.类
类(Class) 是 C++ 中实现面向对象编程(OOP)的核心机制,它将数据(成员变量)和操作数据的函数(成员函数)封装在一起,形成一个独立的实体。
1.访问控制说明符
- private:仅类内部和友元可访问
- public:类内外均可访问
- protected:类内部、友元和派生类可访问
为什么需要三种?
1.安全性:private防止数据被非法访问,public定义安全接口。
2.可扩展性:protected允许派生类访问基类的关键信息,支持继承与多态。
3.封装性:通过分层控制,隐藏实现细节,降低模块间耦合度。
2.成员函数
类内声明,类外定义(使用作用域解析符::)。
1. 构造函数
一种特殊的成员函数,用于初始化对象的状态。
可重载。
1.无参构造函数
若未定义任何构造函数,编译器会生成一个默认构造函数(仅当类没有自定义构造函数时)。
语法:空的实现体。
行为
按顺序:
1.构造虚基类(如果有)
2.调用基类的默认构造函数(如果有基类)。
3.调用成员的默认构造函数(如果成员有默认构造函数)。
4.初始化虚函数表指针(如果类有虚函数或虚基类)。
不初始化内置类型成员(如int、指针等),其值为未定义。
编译器生成的其他构造函数与此类似。
便利
1.使用= default强制编译器生成默认实现:
2.禁用构造函数:使用= delete。
构造函数的初始化列表
1.高效初始化:直接初始化成员变量,优于在函数体中赋值。
初始化优先于函数体的本质原因
1.内存安全:确保对象在使用前完全初始化。
2.拷贝构造函数
用已有对象初始化新对象:参数为const引用。
3.移动构造函数(C++11)
转移资源所有权:避免深拷贝,提高性能。
语法
参数 && ,不加const,因为加了后转移后无法设置nullptr
3.编译器生成的构造函数类型
1. 默认构造函数
1.生成条件:类未定义任何构造函数。
2.被隐式删除:类有引用成员或const成员或没有默认构造函数的类类型成员。
其他:如果类的析构函数、拷贝构造函数或拷贝赋值运算符被显式删除(= delete),默认构造函数可能被隐式删除(取决于具体编译器实现)。
2. 拷贝构造函数(浅拷贝)
1.生成条件:类未显式定义拷贝构造函数。
2.被隐式删除:类有引用成员或 **const成员 ** + 扩充
3. 拷贝赋值运算符(浅拷贝)
1.生成条件:类未显式定义拷贝赋值运算符。
2.被隐式删除:类有引用成员或 **const成员 ** + 扩充
4. 移动构造函数
1.生成条件:
- 1.类未显式定义拷贝构造函数、拷贝赋值运算符、移动赋值运算符和析构函数。
- 2.所有基类和成员均可移动(即有可用的移动构造函数)。
2.被隐式删除:类有引用成员或 **const成员 **+ 扩充
5. 移动赋值运算符
1.生成条件和移动构造函数类似:
- 1.类未显式定义拷贝构造函数、拷贝赋值运算符、移动构造函数和析构函数。
- 2.所有基类和成员均可移动(即有可用的移动赋值运算符)。
2.被隐式删除:类有引用成员或 **const成员 **+ 扩充
6. 其他
遵循三 / 五法则:若定义了析构函数、拷贝构造函数或拷贝赋值运算符,应定义全部五个(析构、拷贝构造、拷贝赋值、移动构造、移动赋值)。
Explicit 作用:
用于禁止构造函数或转换运算符的隐式类型转换。 需要传入一个参数的构造函数初始化。
explicit构造函数会阻止聚合初始化(花括号初始化):
4.析构函数
对象销毁时,析构函数按以下顺序调用:
- 执行类的析构函数体(如果有自定义代码)。
- 成员变量的析构函数(按声明的逆序)。
- 基类析构函数(继承列表中声明的逆序)。
4.处理虚基类(如果有)。
虚基类的析构函数在所有非虚基类之后调用,顺序与构造时相反。