对象初始化可以分为默认初始化、直接初始化、拷贝初始化以及值初始化。C++的类默认提供了六种函数:构造函数、析构函数、拷贝构造函数、等号重载函数、取值运算符、取值运算符const。为了实现这四种初始化方式,有可能需要重写这六个函数。
// 以下这两个类的效果相同
class Person
{}
class Person
{
public:
Person() {...} // deafault构造函数;
Person(const Person&) {...} // 默认拷贝构造函数
~Person() {...} // 析构函数
Person& operator = (const Person &) {...} // 赋值运算符
Person *operator &() {...} // 取值运算符
const Person *operator &() const {...} // 取值运算符const
}
1.默认初始化
如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。
int i;
A a;
2.直接初始化
如果不使用等号,则执行的是直接初始化。
int a(0);
string str1("hello");
string str2(10, 'c');//这种情况拷贝初始化不能完成
A a(pa);
3.拷贝初始化
如果使用一个等号初始化一个变量,实际上执行的是拷贝初始化。编译器会把等号右侧的初始值拷贝到新创建的对象中去。
int a = 0;
int a = {0};
string str1 = "hello";
A pa; A a = pa;
4.值初始化
值初始化仅限于容器类。
vector<int> v1(10);//v1有10个元素,每个的值都是0
vector<int> v2{10};//v2有1个元素,该元素的值是10
vector<int> v3(10, 1);//v3有10个元素,每个的值都是1
vector<int> v4{10, 1);//v4有2个元素,值分别是10和1
hear me roar!
网友评论