70 C++对象模型探索。C++ 几种调用构造函数实例化在编译器内部的不同,去了解这些不同后,我们就知道在代码中如何实例化对象是最优化的。

本节研究是的构造函数相关,所以我们第一步先回忆一下之前学习的构造方法的写法,以及使用构造函数实例化类的写法

一 从之前学习了构造方法的 使用举例,来看编译器在程序员写了代码后的做了些什么,这个要从 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

你可能感兴趣的:(c++,开发语言)