关于初始化


通常情况下,C++中的对象指的是一块能够存储数据并具有某种类型的内存空间。当对象被创建时获得一个特定值的过程称之为初始化。初始化时赋予新建变量一个初始值,这不同于赋值是将变量原有的值擦除后设定一个新的值。


初始化的方式有几种:


//用圆括号或者等号进行初始化会存在丢失信息的风险
int num = 0;
int num(0);
//当使用花括号进行初始化时,如果存在丢失信息的风险会报错
int num ={0};
int num{0};



1、默认初始化


如果变量在被定义时没有指定初始值,则会执行默认初始化。其具体的值与其类型和所处的位置有关。


不被初始化。( 此处可以看出,这种默认初始化并不是通常所说的初始化,也就是给该对象设定一个值,该对象的值是不确定的) 而一个未被初始化的内置类型变量的值是未定义的,访问这样的变量会发生错误。


int i;//i默认初始化为0
 void main()
{
   int i ;//i未初始化,访问时报错
}




2)类的初始化方式由其自身决定。


C++11标准规定,可以为其数据成员提供一个类内初始值,在创建对象时类内初始值用于初始化数据成员,没有类内初始值的成员将会执行默认初始化。 注意,类内数据成员的初始值设定时不能使用圆括号进行直接初始化,但可以使用拷贝初始化和花括号初始化。


string s;//由string类自身的决定初始化,此处ss = "";
void main()
{
     string ss;//由string类自身的决定初始化,此处ss = "";
}





2、直接初始化


如果不使用等号(使用圆括号或者花括号)对新建的对象进行初始化称之为直接初始化。对于基本内置数据类型,使用圆括号或者花括号就是直接初始化;而对于类类型,就需要考虑类内部的实现机制,直接初始化实际上是要求编译器使用普通的函数匹配来选择与提供的参数最匹配的构造函数。


string s("aaa");
int a(0);




3、拷贝初始化


如果使用等号(=)初始化一个变量,实际执行的就是拷贝初始化( 但并不意味着发生拷贝初始化只有使用赋值运算符这一种方式),编译器把等号右边的初始值拷贝到新创建的对象中去。对于类类型对象,拷贝初始化通常使用拷贝构造函数或者移动构造函数来完成。


string s = ”aaa“;



4、值初始化


系统或者说库自己按照对应的类型创造一个元素初值,并把它赋给对应的对象。大多时候用于类。