先从简单的来看
int a = 3;//这是复制初始化
int b(3);//这叫直接初始化
int c;//如果是全局对象刚初化为0。不是的话则不进行初始化,其值不确定。
c = 4;//这是赋值
可以理解成,在定义一个对象时马上为其指定一个值的行为是初始化。而赋值是初始化之后用=号指定对象值的行为。
//用类来观察会更清晰
#include<iostream>
using namespace std;
class A
{
public:
A() : a(0)
{
cout << "默认构造函数被调用" << endl;
}
A(int i) : a(i)
{
cout << "构造函数被调用" << endl;
}
A(const A& b) : a(b.a)
{
int d;
cin >> d;
a += d;
cout << "复制构造函数被调用" << endl;
}
A& operator= (const A& b)
{
a = b.a;
cout << "重载的赋值操作符被调用" << endl;
return *this;
}
private:
int a;
};
int main(int argc, char *argv[])
{
A a;//输出 "默认构造函数被调用"
A g = a;//输出"复制构造函数被调用"
a = g;//输出"重载的赋值操作符被调用"
A c = 9;//"构造函数被调用"
return 0;
}
对A c = 9;来说先用9产生一个A类型的临时对象(调用A(int i) : a(i){}),然后使用复制构造函数来用c初始化。
但是因为编译器的优化功能,它会直接对c调用A(int i) : a(i){}进行初始化。
[
本帖最后由 lintaoyn 于 2010-9-22 08:17 编辑 ]