2.6C++变量的初始化形式

变量的初始化形式

1.声明和初始化和赋值的关系:

  • 声明:指定一个变量的名字,仅仅是让编译器知道有这个名字,而没有实际分配空间
  • 初始化:给一个声明后尚未初始化后的变量一个有意义的初始值。
  • 赋值:销毁一个变量原来的值,并赋予一个新值。

初始化和不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象当前的值擦除,而以一个新值来替代。

2.变量的初始化形式

2.1直接初化:调用与实参匹配的有参构造函数,如:

string s1("hiya");   //直接初始化,s1初始化为"hiya"
string s2(10,'c');   //直接初始化的第二种方式,将s2初始化成10个'c'

2.2拷贝初始化:使用=初始化一个变量,执行的是拷贝初始化。如:

string s1="huya";
int units_sold=0;

初始值只有一个时,使用直接初始化或拷贝初始化都可以,但如果初始值有多个,则一般只能使用直接初始化方式,使用拷贝初始化的话会创建一个临时对象用于拷贝:

 //只有一个初始值"abc",拷贝初始化等同于直接初始化
string s1 = "abc";  
string s2("abc");    
//有多个初始值'c',一般用值初始化,使用拷贝初始化会创建临时变量
string s3(10,'c');        //直接初始化
string s4 = string(10,'c'); //必须用这种形式来拷贝初始化

2.3列表初始化:列表初始化在C++11中可以用于以下几种情况

  • 用于数组初始化,如:
int arr[]={1,2,3};
int arr2[]{1,2,3,4};
  • 用于STL容器初始化,如vector,string等,如:
vector<int> v1{1,2,3};
string s{"abc"};
  • 用于new操作等圆括号进行初始化的地方,如:
int *a = new int {3};
double b = double{12.12};
int *arr =new int[] {1,2,3};
  • 用于聚合体的初始化(所有成员都是public的;没有定义任何构造函数;没有类内初始值;没有基类也没有virtual函数),要求初始值顺序必须和声明顺序一致。 如:
struct Data{
  int val;
    string s;
};
Data v = {0, "OK"};     //正确
Data v2 = {"OK", 0};    //错误:初始值顺序必须和声明顺序一致

2.4默认初始化:

  • 对于内置类型:如果变量定义在所有函数体外,则初始化为0;如果定义在函数体内,则不被初始化没有定义(使用未定义的变量将会产生不确定的后果,编译会报错)

  • 对于自定义类型:一般来说都可以无需初始化定义(会调用默认构造函数);如果一些类定义时必须要求促使话则会发生错误。

2.5值初始化:

①值初始化效果:

  • 内置类型零初始化对象
  • 数组则值初始化数组的每个元素
  • 如果类类型有用户定义的默认构造函数,则执行用户定义的默认构造函数;如果有合成的默认构造函数,则先进行零初始化后再执行合成的默认构造函数。

②值初始化用于以下几种情况

  • 以空的括号或花括号对组成的初始化器创建无名临时对象时,如:
int v1 = int{}; //v1=0
double f1 = double(); //f1=0.0
  • 用new表达式以空括号或花括号创建堆区动态对象时,如:
int *p1 = new int(); //p1指向的内存值为0
int *p2 = new int[10](); //p2指向的数组每个值都为0
int *p3 = new int[10]{}; //p3指向数组有2个元素,分别为10,11
  • 以由空花括号创建自定义对象时, 如:
//有合成的默认构造函数
struct A1{
int v=1;
string s;
};
//无默认构造函数
stuct A2{
int v;
string s;
A2(int v){}
};
//有自己定义的默认构造函数
struct A3{
int v;
string s;
A3(){}
};
A1 a1{};    //合成默认构造函数零初始化后再初始化,v=0,s为空
A2 a2{};    //错误:类无默认构造函数不能初始化
A3 a3{};    //自己定义的构造函数来进行默认初始化,v随机值,s为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值