如果变量在全局域中定义,那么系统会保证给它提供初始值0;
如果变量在局部域中定义或通过new表达式动态分配的,则系统不会提供初始值0。这戏对象被称为未初始化的(与他关联的内存区中含有一个随机的位串,可能是以前使用的结果)。
下面举两个例子(见注释):
1、
using namespace std;
int a; //未初始化,系统自动初始化为0
main()
{
int b;
cout<<a<<"/n"<<b<<endl; //会出现运行期错误
}
int a; //未初始化,系统自动初始化为0
main()
{
int b;
cout<<a<<"/n"<<b<<endl; //会出现运行期错误
}
2、
#include <string>
using namespace std;
string as; //未初始化,系统自动初始化为0
main()
{
string bs ; //未初始化,运行无误,应该调用默认构造函数。
cout<<as<<" "<<bs<<endl; //返回两个空串
}
using namespace std;
string as; //未初始化,系统自动初始化为0
main()
{
string bs ; //未初始化,运行无误,应该调用默认构造函数。
cout<<as<<" "<<bs<<endl; //返回两个空串
}
由此可以看出,对于有默认构造函数的类,在哪里定义都会默认调用构造函数初始化。
使用未初始化的对象是错误的,因此建议对每个对象提供一个初始值。
另外,初始化有两种形式:
int a = 666; //显式初始化
int a(666); //隐式初始化
int a(666); //隐式初始化
需要思考一些这两种形式调用类的那种操作符???