首先明确一点:初始化和赋值是两个不同的概念
看下面的代码
#include<iostream>
#include<vector>
using namespace std;
class Test
{
public:
Test()
{
cout << "默认构造函数被执行";
}
Test(int _a, int _b,int _c) :a(_a), b(_b)//这是初始化列表,是真正的初始化
{
c = _c;//这是错误的,因为这里是赋值
}
private:
int a;
int b;
const int c;
};
void main()
{
Test a;
system("pause");
}
这段代码可以明确的告诉我们,初始化列表是真正的初始化,因为const的变量必须赋初值,而如果把初始化的过程写在里面的话
其实这并不是初始化,而是赋值。
看下面的代码
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Test
{
public:
Test()
{
cout << "默认构造函数";
}
Test(string _s)
{
cout << s << endl;
s = _s;
}
private:
string s;
};
void main()
{
system("pause");
}
如果我们没有使用初始化列表,那么数据成员将在构造函数函数体之前执行默认初始化
,例如上面的代码输出的是空串,这是string的默认初始化。或者我们可以自己写一个类
来看看效果。看下面的代码
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Mystring//只是用做实验的类,切记不要这样写
{
public:
Mystring()
{
p = "hello word";
}
private:
char *p;
};
class Test
{
public:
Test()
{
cout << "默认构造函数";
}
Test(string _s)
{
printf("%s", s);
}
private:
Mystring s;
};
void main()
{
Test a("hello");
system("pause");
}
你可以自己写两个类进行实验,这段代码打印的结果是“helloword”。
下面引用c++primer的一段话
在很多类中,初始化和赋值的区别事关底层效率的,一个是直接初始化,
而另外一个却是先初始化后赋值。而且不单单是效率问题,一些数据成员必须
初始化,而不是赋值,所以建议使用初始化列表。