c++构造函数研究

本文探讨了C++中构造函数调用的现象,特别是直接在构造函数内部调用其他构造函数的情况。通过两个具体示例,分析了不同情况下构造函数执行流程与数据状态的变化,揭示了构造函数调用过程中的一些细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习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;
因为我们无参数构造中调用了下面的有参数构造函数。
并且,会将产生的实例返回给默认构造函数。最后再执行默认构造函数中的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值