关于默认构造函数的一点琢磨--全局变量和局部变量

本文探讨了C++中全局和局部变量与默认构造函数的关系。当未定义构造函数时,全局变量会被初始化为0,而局部变量则成为未初始化的。如果定义了非默认构造函数,编译器不会合成默认构造函数,导致无法自动初始化。对于两者都定义的情况,变量仍会初始化。作者寻求对此现象的深入理解。

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

首先看一个例子:

class A
{
public:      //为了直接访问
	int i;   
};

A a;
int main(void)
{
	cout << a.i << endl;
	return 0;
}
这里的输出结果是0,因为a是一个全局变量,编译器在编译的时候会获得编译单元内的全局变量,然后生成两个函数:

_sti() 和_std(),执行对象的构造和析构。

本例中,没有定义类A的构造函数,但是编译器也不会为我们合成一个default constructor,原因见《深入探索C++对象模型》第二章,

class A
{
public:
	A() = default;
	int i;
};
A a;
int main(void)
{
	cout << a.i << endl;
	return 0;
}
一样的结果。

class A
{
public:
	A(int j) { i = j; }
	int i;
};
A a;
int main(void)
{
	cout << a.i << endl;
	return 0;
}
显示没有合适的默认构造函数。编译错误。

class A
{
public:
	A(int j) { i = j; }
	A() = default;  //和 A() { } 效果一样
	int i;
};
A a;
int main(void)
{
	cout << a.i << endl;
	return 0;
}
显示0.

再看一个变型:

class A
{
public:
	int i;
};

int main(void)
{
	A b;
	cout << b.i << endl;
	return 0;
}
此时, b是一个局部变量,编译的时候显示“使用了未初始化的局部变量“b” ”,编译错误。

即使要求编译器为我们合成一个default constructor:

class A
{
public:
	A() = default;
	int i;
};

int main(void)
{
	A b;
	cout << b.i << endl;
	return 0;
}
也无济于事,还是显示“使用了未初始化的局部变量“b” ”。


但如果此时定义了一个构造函数,而没有定义默认构造函数(因为已经有一个自己定义的构造函数了,编译器更不会为我们合成一个默认的):

class A
{
public:
	A(int j) { i = j; }
	int i;
};

int main(void)
{
	A b;
	cout << b.i << endl;
	return 0;
}
显示a没有合适的默认构造函数,

class A
{
public:
	A(int j) { i = j; }
	A() = default;
	int i;
};

int main(void)
{
	A b;
	cout << b.i << endl;
	return 0;
}
编译器给出的信息是b是未初始化的局部变量,

再看:

class A
{
public:
	A(int j) { i = j; }
	A() { }
	int i;
};

int main(void)
{
	A b;
	cout << b.i << endl;
	return 0;
}


此时有了一个默认构造函数,显示:

自己定义了一个默认构造函数和要求编译器为我们合成的默认构造函数有什么不一样吗? 

显然,即使编译器为我们合成了默认构造函数,也不会在函数体内为我们去初始化这些变量。

总结

a是全局变量的时候:如果没有定义构造函数,则初始化为0;

      定义了构造函数但不是默认的,显示没有默认构造函数可用;

      两者都定义了,初始化为0。

b是局部变量的时候:如果没有定义构造函数,则显示定义了一个未初始化的局部变量;

      定义了构造函数但不是默认的,显示没有默认构造函数可用;

      两者都由自己定义,则显示的是垃圾值;

用户定义了一个非默认构造函数,编译器合成了一个默认构造函数,则显示定义了一个未初始化的局部变量。


说明:以上只是本人在看书的时候的一些想法,就去试验了一下,个中缘由还不能很好的把握,只能慢慢体会,希望能够理解的大神给小弟一些指点,不胜感激哪?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值