本节研究是的构造函数相关,所以我们第一步先回忆一下之前学习的构造方法的写法,以及使用构造函数实例化类的写法
一 从之前学习了构造方法的 使用举例,来看编译器在程序员写了代码后的做了些什么,这个要从 vs2017的C++编译器和Linux下g++编译器 都做了什么?
class Teacher33 {
public:Teacher33() {cout << "Teacher33 的 构造函数 被调用 " << this << endl;}//带有一个参数的构造函数也叫做 类型转换构造函数Teacher33(int age) :mage(age) {cout << "Teacher33 的 有参数的 构造函数 被调用 " << this << endl;}Teacher33(const Teacher33 &obj) :mage(obj.mage) {cout << "Teacher33 的 copy构造函数 被调用 " << this << endl;}virtual ~Teacher33() {cout << "Teacher33 的 析构函数 被调用 " << this << endl;}
public:int mage;
};void main(){//旧的回忆Teacher33 tea1;cout << "-----1------" << endl;Teacher33 tea2(10);cout << "-----2------" << endl;Teacher33 tea3 = 1000;cout << "-----3------" << endl;Teacher33 tea4 = Teacher33(888);cout << "-----4------" << endl;Teacher33 tea5 = (Teacher33)999;cout << "-----5------" << endl;}
在vs 2017上代码运行的结果如下:
Teacher33 的 构造函数 被调用 0000009F576FF5E8
-----1------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF618
-----2------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF648
-----3------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF678
-----4------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF6A8
-----5------
Teacher33 的 析构函数 被调用 0000009F576FF6A8
Teacher33 的 析构函数 被调用 0000009F576FF678
Teacher33 的 析构函数 被调用 0000009F576FF648
Teacher33 的 析构函数 被调用 0000009F576FF618
Teacher33 的 析构函数 被调用 0000009F576FF5E8
疑问:
我们看到结果是如上的代码都调用了构造方法,这显然和我们的预期不同,
至少在如下的这一行,就不应该只有构造函数被调用。
Teacher33 tea4 = Teacher33(888);
验证问题
将如上的代码放在linux下运行,并且用命令告诉g++不要优化代码。
命令为:其中a.cpp 为源文件名,-o 后面的aobj是你命名的文件名字
g++ -fno-elide-constructors a.cpp -o aobj
运行后
结果为:
Teacher33 的 构造函数 被调用 0x7ffcc93afd30
-----1------
Teacher33 有参数的 构造函数 被调用0x7ffcc93afd40
-----2------
Teacher33 有参数的 构造函数 被调用 0x7ffcc93afd60 //这玩意应该是个临时变量
Teacher33 Teacher33 的 copy构造函数 被调用 0x7ffcc93afd50
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd60 //析构这个临时变量
-----3------
Teacher33 有参数的 构造函数 被调用 0x7ffcc93afd80
Teacher33 Teacher33 的 copy构造函数 被调用 0x7ffcc93afd70
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd80
-----4------
Teacher33 有参数的 构造函数 被调用 0x7ffcc93afda0
Teacher33 Teacher33 的 copy构造函数 被调用 0x7ffcc93afd90
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afda0
-----5------
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd90
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd70
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd50
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd40
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd30