我的测试环境
所有代码win11的vs2017 版本15.9.24 中测试。
重点知识/结论总结
- 虽然原书中提到用等号来初始化值可能会导致调用赋值运算符(多执行赋值的步骤,效率低),但是我实测并没有此问题。当然,这个结果是符合预期的,毕竟明明是没必要去多执行一次赋值运算符来赋值的。但是不排除别的环境,别的VS版本,甚至在别的优化等级下表现不同。所以建议自行测试。
- 即便如此,还是建议初始化一个对象使用变量后面用括号赋值初始化的值的方式: StringBad ditto(motto);来规避可能的歧义和不确定的执行流程。
- 默认的复制构造函数和默认的赋值运算符都是浅拷贝/浅复制。所以在类中如果有成员变量是指针,指向在构造函数中动态申请的内存的时候,务必自定义复制构造函数和赋值运算符(而不是使用默认的),否则必出现同一块内存重复释放的问题!
正文开始
特殊成员函数
书中原文如下:
12.1.2 特殊成员函数
C++自动提供了下面这些成员函数:
• 默认构造函数,如果没有定义构造函数:
• 默认析构函数,如果没有定义;
• 复制构造函数,如果没有定义;
• 赋值运算符,如果没有定义:
• 地址运算符,如果没有定义。
下面为了方便举例,我们假设有这样一个类:
class A {
int a;
public:
int geta(void) { return a; }
...
};
1. 默认构造函数
如果没有提供任何构造函数,C++将创建默认构造函数,即编译器将提供一个不接受任何参数 ,也不执行任何操作的构造函数。函数形如:
A::A() {
} // 通过默认构造函数创建的对象的值是未知的
验证代码:
#include<iostream>
using namespace std;
class A {
int a;
public:
int geta(void) {
return a; }
};
#if 1
int main(void) {
A a;
cout << a.geta() << endl; // 输出结果不一定
}
#