首先看一个例子:
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是局部变量的时候:如果没有定义构造函数,则显示定义了一个未初始化的局部变量;
定义了构造函数但不是默认的,显示没有默认构造函数可用;
两者都由自己定义,则显示的是垃圾值;
用户定义了一个非默认构造函数,编译器合成了一个默认构造函数,则显示定义了一个未初始化的局部变量。
说明:以上只是本人在看书的时候的一些想法,就去试验了一下,个中缘由还不能很好的把握,只能慢慢体会,希望能够理解的大神给小弟一些指点,不胜感激哪?