C++ 变量的声明和初始化

值初始化和默认初始化的适用场景:

值初始化:

(1)在数组初始化的过程中,如果提供的初始值数量少于数组的大小,剩下的元素会进行值初始化;

(2)静态static变量定义在块作用域外的全局变量如果没有显式的初始值,将执行值初始化;

(3)当我们通过书写形如T()的表达式显式地请求值初始化时;

默认初始化:

(1)当我们在块作用域内类内也属于块作用域内)不使用任何初始值定义一个非静态变量时;

(2)当一个类本身含有类类型成员且使用合成的默认构造函数时;

(3)当类类型的成员没有在构造函数初始值列表中显式地初始化时;

声明:     在环境/上下文中指定一个变量的名字。也就是说,声明仅仅是让编译器知道,而没有实际分配空间。

初始化: 给一个声明后尚未初始化的变量一个有意义的初始值。

赋值 :   销毁一个变量原来的值,并赋予一个新值。相当于改变了一个变量的状态

初始化是在声明一个变量的同时赋予它一个值,而赋值是已经声明过了变量,后续再对它进行赋值操作。对于内置类型:

//在一个块作用域内
{ 
    int i;    //默认初始化,其值未定义
    int j=0;  //值初始化
    j=1;      //赋值
}

定义于块作用域内(类内也属于块作用域内)的内置类型变量将不被初始化,其值未定义;定义于块作用域外的全局变量被值初始化为0。

静态static变量如果没有显式的初始值,它将执行值初始化。

 1 class X
 2 {
 3     int a;           
 4 public:
 5     void ShowX(){cout << a ;}
 6     X() = default;
 7 };
 8 int main()
 9 {
10    X xx;
11    xx.ShowX();    //对象xx中的a成员的值被默认初始化,由于a是在块作用域内定义的,所以此处输出的值未定义
12 
13    return 0;
14 }

对于自定义类型和STL中的容器,

class A;
A a=A();//值初始化
std::vector<int> vec1;//默认初始化,调用默认构造函数

一个类对象进行默认初始化和值初始化,必须要有相应的默认构造函数。否则将会报错,因为无法构造这个类。

声明:     在环境/上下文中指定一个变量的名字。也就是说,声明仅仅是让编译器知道,而没有实际分配空间。

初始化: 给一个声明后尚未初始化的变量一个有意义的初始值。

赋值 :   销毁一个变量原来的值,并赋予一个新值。相当于改变了一个变量的状态

初始化是在声明一个变量的同时赋予它一个值,而赋值是已经声明过了变量,后续再对它进行赋值操作。对于内置类型:

//在一个块作用域内
{ 
    int i;    //默认初始化,其值未定义
    int j=0;  //值初始化
    j=1;      //赋值
}

定义于块作用域内(类内也属于块作用域内)的内置类型变量将不被初始化,其值未定义;定义于块作用域外的全局变量被值初始化为0。

静态static变量如果没有显式的初始值,它将执行值初始化。

 1 class X
 2 {
 3     int a;           
 4 public:
 5     void ShowX(){cout << a ;}
 6     X() = default;
 7 };
 8 int main()
 9 {
10    X xx;
11    xx.ShowX();    //对象xx中的a成员的值被默认初始化,由于a是在块作用域内定义的,所以此处输出的值未定义
12 
13    return 0;
14 }

对于自定义类型和STL中的容器,

class A;
A a=A();//值初始化
std::vector<int> vec1;//默认初始化,调用默认构造函数

一个类对象进行默认初始化和值初始化,必须要有相应的默认构造函数。否则将会报错,因为无法构造这个类。

猜你喜欢

转载自www.cnblogs.com/FengZeng666/p/9276618.html