c++为什么有很多的初始化方法?
2017-08-18 22:53
232 查看
答案是:让新手更容易学习c++。(天啊!)
这也造成了一个后果:在c++语言中,初始化是一个异常复杂的问题。
先说说初始化的定义:初始化就是将赋值与声明合并在一起,当对象在创建时获得了一个特定的值,我们就说这个对象被初始化了。
举一个例子,定义并初始化一个局部自动int变量(有下面四种写法):
默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。此时变量被赋予“默认值”。默认值到底是什么由变量的类型决定,同时定义变量的位置也会对此有影响。
值初始化:手动给出初始化值。
对于定义了自己的构造函数的类类型来说,要求值初始化是没有意义的;不管采用什么形式,对象都会通过默认构造函数来初始化。但对于内置类型,两种形式的差别就很大了;值初始化的内置类型对象有着良好定义的值,而默认初始化的对象的值则是未定义的。类似的,对于类中那些依赖于编译器合成的默认构造函数的内置类型成员,如果它们未在类内被初始化,那么它们的值也是未定义的。
这也造成了一个后果:在c++语言中,初始化是一个异常复杂的问题。
先说说初始化的定义:初始化就是将赋值与声明合并在一起,当对象在创建时获得了一个特定的值,我们就说这个对象被初始化了。
举一个例子,定义并初始化一个局部自动int变量(有下面四种写法):
int i = 0; int i(0); int j = {0}; int j{0};使用花括号的初始化形式是c++ 11新标准引入的(称为列表初始化),以前c++使用不同的方式来初始化不同的类型,现在可以使用花括号来初始化任何类型了。
默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。此时变量被赋予“默认值”。默认值到底是什么由变量的类型决定,同时定义变量的位置也会对此有影响。
值初始化:手动给出初始化值。
string *ps1 = new string;//默认初始化为空string string *ps = new string();//值初始化为空string int *pi1 = new int;//默认初始化;*pi的值未定义 int *pi2 = new int();//值初始化0;*pi为0
对于定义了自己的构造函数的类类型来说,要求值初始化是没有意义的;不管采用什么形式,对象都会通过默认构造函数来初始化。但对于内置类型,两种形式的差别就很大了;值初始化的内置类型对象有着良好定义的值,而默认初始化的对象的值则是未定义的。类似的,对于类中那些依赖于编译器合成的默认构造函数的内置类型成员,如果它们未在类内被初始化,那么它们的值也是未定义的。
相关文章推荐
- C++中各种类型的成员变量的初始化方法
- C++——二维vector初始化大小方法
- C++中各种类型的成员变量的初始化方法(转)
- C++总是能让我想起什么(7) ——类成员进行初始化,通常的方法有两种
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- C++ map容器的2种初始化方法
- C++初始化列表时,为什么不能直接在构造函数中输出
- c++ 带有初始化成员列表的类构造函数 定义与实现分离 方法
- C++为什么需要成员初始化列表
- 转载--c++中构造函数初始化的方法以及主要区别
- C++中各种类型的成员变量的初始化方法
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- C++——二维vector初始化大小方法
- C++中构造函数初始化列表为什么会比构造函数中赋值要高效
- 为什么c++ 中类内初始值不能使用圆括号初始化?
- 在C++中实现库动态初始化的一种方法
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- c++中构造函数初始化的方法以及主要区别
- C++数组初始化方法
- C++为什么用初始化列表初始化类的成员变量