在学习C++的过程中,发现C++的构造函数在调用的时候一些现象。
1:在直接在构造函数中调用构造数,虽然执行流程是理想的,但数据是独立的。
例1:
#include <iostream>
using namespace std;
class a {
int num1;
int num2;
int num3;
public:
a():num1(1), num2(2){
cout<<num1<<":"<<num2<<endl;
num3 = 6;
a(num1, num2);
};
a(int a1):num1(a1) {
num3 = 5;
num2 = 2;
a(num1, 2);
};
a(int a1, int a2):num1(a1), num2(a2){
num3 = 4;
cout<<num1<<":"<<num2<<endl;
};
int get() {
return num3;
};
};
int main() {
a *t = new a();
cout<<t->get()<<endl;
delete t;
return 0;
}
上面的代码,从直觉上来看,get回来的num3应该等于4,
但是当你把代码复制出来,测试之后,你会发现,num3其实等6;
这是因为实例化时,是使用的是无参数实例化的,这时返回的是无参数的构造函数的实例。
虽然调用也调用了有参数的那个构造函数,但是,也只是被调用了,但并未将实例返回。
当我们把默认构造函数中的赋值操作删除,会发现,get回来的值也不会是4,而是0;
这也进一步验证了并未返回真正的实例。
例2:
#include <iostream>
using namespace std;
class a {
int num1;
int num2;
int num3;
public:
a():a(1, 2) {
num1 = 1;
num2 = 2;
};
a(int a1):a(a1, 2) {
num1 = a1;
};
a(int a1, int a2) {
num1 = a1;
num2 = a2;
num3 = 4;
};
int get() {
return num3;
};
};
int main() {
a *t = new a();
cout<<t->get()<<endl;
delete t;
return 0;
}
在第二个例子中,表面上看起来,似乎num3是0, 因为我们没有直接对num3进行赋值。
但是,结果却是4;
因为我们无参数构造中调用了下面的有参数构造函数。
并且,会将产生的实例返回给默认构造函数。最后再执行默认构造函数中的操作。