博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
变量的默认初始化和值初始化
阅读量:6213 次
发布时间:2019-06-21

本文共 1738 字,大约阅读时间需要 5 分钟。

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

值初始化:

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

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

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

 

默认初始化:

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

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

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

 

一、相关概念:

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

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

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

 

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

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

 

 三、对于定义了自己的构造函数的类类型(例如string)来说,不管采用默认初始化还是值初始化,对象都会通过默认构造函数来初始化。

        但对于内置类型,值初始化的内置类型对象有着良好定义的值,而默认初始化的对象的值则是未定义的。

        对于类中那些依赖于编译器合成的默认构造函数的内置类型成员,如果他们未在类内被初始化,那么它们的值也是未定义的。

1     string *ps1 = new string;     //默认初始化为空string 2     string *ps2 = new string();   //值初始化为空string 3     int *pi1 = new int;           //默认初始化;*pi1的值未定义 4     int *pi2 = new int();         //值初始化为0;*pi2为0 5  6  7     class X 8     { 9         int a;10     public:11         void ShowX()12         {13             cout << a ;14         }15         X() = default;16     };17     int main()18     {19         X xx;20         xx.ShowX();    //对象xx中的a成员的值被默认初始化,由于a是在块作用域内定义的,所以此处输出的值未定义21 22         return 0;23     }

 

 

 

四、定义于块作用域内(类内也属于块作用域内)的内置类型变量将不被初始化,其值未定义;定义于块作用域外的全局变量被值初始化为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
vec1;//默认初始化,调用默认构造函数

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

 

 

转载于:https://www.cnblogs.com/FengZeng666/p/9276618.html

你可能感兴趣的文章
Linux基础软件包编译安装
查看>>
限定某个目录禁止解析(apache)
查看>>
java 面向对象
查看>>
Spring Task使用笔记
查看>>
linux资料整理之进程管理
查看>>
Jenkins实践--Jenkins搭建和使用
查看>>
我的友情链接
查看>>
Linux的iptables(一)
查看>>
Cannot create a server using the selected type ...
查看>>
linux系统redhat中固定ip地址(使用静态ip)的配置方法
查看>>
数据的游戏:冰与火
查看>>
rss订阅开发
查看>>
SQL中的cast()函数介绍
查看>>
Kubernetes Deployment滚动更新场景分析
查看>>
eclipse中的.project 和 .classpath文件的具体作用
查看>>
JavaScript—内置对象
查看>>
神经网络和深度学习-第二周神经网络基础-第二节:Logistic回归
查看>>
Myeclipse代码提示及如何设置自动提示
查看>>
Linux学习---Day04
查看>>
Git使用详细教程
查看>>