C++类内初始值的初始化形式

  • 一.不能用圆括号给类内初始值的原因
  • 二.=和花括号{}初始化的区别
    • 1.内置类型和类类型
    • 2.类模板
      • 先看初始化列表{}:
      • 再看=的初始化过程:
      • ==总结:==
  • 三.类内初始值的初始化列表{}方式

C++11规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值用于初始化数据成员。像下面这样,cursor和height的类内初始值均为0。

class Screen
{private:int cursor = 0;int height = 0;
};

一.不能用圆括号给类内初始值的原因

C++ primer(第5版)中写道:类内初始值的提供必需以=或者花括号{}的形式。不能用园括号()

关于这一点,可以参考网上的一个说法,如下:
由于无法避免下面的这种情况,这相当于对于int z(int);函数的声明,所以C++把用圆括号进行类内初始值定义为非法。

class Widget
{private: typedef int x;  int z(x);
};

二.=和花括号{}初始化的区别

1.内置类型和类类型

对于这两者而言,=和{}初始化的区别不大,测试如下。

#include <iostream>     // std::cout
#include <string>
#include <vector>using namespace std;int main()
{std::cout << "*****内置类型*****" << std::endl;int ival = 1;int ival2{ 1 };int ival3 = { 1 };//实际上同ival2{ 1 }一样std::cout <<"ival = " <<ival << std::endl;std::cout <<"ival2 = " <<ival2 << std::endl;std::cout <<"ival3 = " << ival3 << std::endl;std::cout << "*****类*****" << std::endl;string str = "aa";string str2{ "aa" };string str3 = { "aa" };//实际上同str2{ "aa" }一样std::cout << "str = " << str << std::endl;std::cout << "str2 = " << str2 << std::endl;std::cout << "str3 = " << str3 << std::endl;system("pause");return 0;
}

2.类模板

对于类模板而言,我们可以看看实际上初始化列表{}和=初始化的过程:

先看初始化列表{}:

std::vector<std::string> vs{ "ssss" ,"dddd"};

可以看到,上面的初始化的最后一步是在vector中插入初始化列表中元素

再看=的初始化过程:

因为它实际上是一个拷贝构造的过程,所以=的右边必须是一个同类型的值,如下所示。vs3可以看成是一个’std::vector’类型的变量,那么只能用’std::vector’类型的变量来初始化它,比如下面的vs_tmp。

 std::vector<string> vs_tmp;std::vector<string> vs3 = vs_tmp;

注意,千万不能这样:std::vector<string> vs2 = "eee";
上述初始化最后调用的是vector的拷贝构造函数,如下:

总结:

  • 初始化列表,列表中的元素就是模板的元素,如vector<string> tmp_vec= {"ddd","www"}
  • =初始化,只能用同类型,如只能用vector类型初始化vector类型

三.类内初始值的初始化列表{}方式

我在实际上调试时发现如下这样的一个问题:类内初始值的初始化列表{}方式编译器会报错。定义的类如下。
这让我很迷惑,因为在上面的测试中是可以的?后来才发现,因为我用的是VS2013,而它并不是完全支持C++11标准,所以对类内初始值用初始化列表的形式可能还不支持,换一个编译器后,不再报错。

class Wind_mgr
{public:void putsData(){str.push_back("aaa");}
private:std::vector<std::string> str{"bbb"};//Error,无法从“const char [4]”转换为“const std::allocator<_Ty>”
};

最后附上vector的几种初始化形式:

初始化格式 说明
vector v1 生成一个空vector
vector v2(V1) v2包含v1的所有元素副本
vector v2 = v1 等价于V2(V1)
vector v3(n,val) v3被初始化为n个val值,即v3有n个重复的元素
vector v4(n) v4是一个有n个元素的vector,只是n个元素均为值初始化值
vector v5{a,b,c…} v5的大小就是初始化列表的大小,每个元素的值是初始化列表的值
vector v5 = {a,b,c…} 等价于V5{a,b,c…}
vector v6 (first, last) 将迭代器[first,last)区间的元素拷贝到v6

C++类内初始值的初始化形式相关推荐

  1. 初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化

    文章目录 初始化和赋值的区别 什么是默认初始化? 列表初始化 列表初始化的使用场景 不适合使用列表初始化的场景 类内初始值 混用string对象和C风格字符串 数组与vector对象 关于vector ...

  2. c++ 该使用类内初始值么?

    c++ 该使用类内初始值么? 我们c++老师说类声明里不要出现定义,类内初始值是不标准的写法,他应该觉得下面这么写才对 class Foo { public:Foo();Foo(int); priva ...

  3. c++类内的static变量初始化和static函数

    class A {static int si; static void sfunc(){cout<< si;} }; int A::si=0;//静态成员不能在类内初始化. 使用时:int ...

  4. C++中内置变量的初始化

    对于全局的变量 如果内置类型的变量未被显示地初始化,它的值将由定义的位置决定. (1).定义在函数体之外的变量将被初始化为0: (2).定义在函数体内部的变量将不被初始化,它的值将是任意的. 对于(1 ...

  5. 【Java】变量的分类(作用域,初始值,生命周期)

    1. 变量的分类 变量根据在类中定义位置的不同,可以分为两大类: 成员变量:全局变量/字段(Field),不要称之为属性(错误),直接定义在类中,方法外面: (1)类成员变量:使用static修饰符: ...

  6. DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程

    DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程 目录 输出结果 设计思路 核心代码 更多输出 相关文章: ...

  7. 4修改初始值_Java基础语法 --4(连载)

    第一部分 : IDEA开发工具 参见 :IEDA的安装请参考文件夹PPT中的 04_IDEA.ppt 1.数组 1.1 数组介绍 ​ 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1 ...

  8. 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器...

    1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...

  9. python权重初始值设置_pytorch自定义初始化权重的方法

    在常见的pytorch代码中,我们见到的初始化方式都是调用init类对每层所有参数进行初始化.但是,有时我们有些特殊需求,比如用某一层的权重取优化其它层,或者手动指定某些权重的初始值. 核心思想就是构 ...

  10. Java面向对象之成员变量的初始值、object类与对象

    一.成员变量初始值 1.测试 class Test06_Num{ //定义一个数据类//在类中定义各种类型的变量,但是不给值int i; byte b;short s;long l;float f;d ...

最新文章

  1. 在MM32F3273上运行MicroPython,对于性能进行测试
  2. R语言报错:Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : n行没有x元素
  3. nvcc 已退出,返回代码为1
  4. Netty 高性能特性
  5. 后端技术:mybatis插件原理详解
  6. php的几种运行模式CLI、CGI、FastCGI、mod_php
  7. Run ASMX Without IIS
  8. leetcode 200 python
  9. 亚马逊新任CEO本周一上任 未来十年将获价值2.1亿美元公司股票
  10. “庆渝年”​又更新了!法院裁定:禁止李国庆接触、骚扰、殴打俞渝
  11. jmeter JDBC Request
  12. [转载] Pytorch入门实战-----逻辑回归识别手写数据集
  13. 二级分类php代码,php smarty 二级分类代码和模版循环例子
  14. 防止重复提交表单的两种方法
  15. 牛腩新闻发布系统(一)
  16. linux下rfkill命令管理蓝牙和wifi
  17. 百度地图兴趣点抓取工具
  18. 使用iso镜像文件创建yum源
  19. 【小资生活】话剧——无人生还
  20. python如何获取列表的长度

热门文章

  1. 第一周挑战2:税后工资计算器
  2. 解决了Office2007向程序发送命令时出现错误 的问题
  3. 怎样开启无线热点服务器,Win7开启无线WIFI热点
  4. 2cm有多长实物图_一厘米有多长,求图片
  5. 数据挖掘常用算法整理
  6. 安排,2020新kafka视频教程零基础到精通
  7. 南充十中高考2021成绩查询,2021年南充十中招办电话是多少?
  8. Snapchat面经
  9. 《Excel大神上分攻略》学习笔记1——填充、行列操作、数据格式
  10. [iOS]分析Mach-O文件