C++类内初始值的初始化形式
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++类内初始值的初始化形式相关推荐
- 初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化
文章目录 初始化和赋值的区别 什么是默认初始化? 列表初始化 列表初始化的使用场景 不适合使用列表初始化的场景 类内初始值 混用string对象和C风格字符串 数组与vector对象 关于vector ...
- c++ 该使用类内初始值么?
c++ 该使用类内初始值么? 我们c++老师说类声明里不要出现定义,类内初始值是不标准的写法,他应该觉得下面这么写才对 class Foo { public:Foo();Foo(int); priva ...
- c++类内的static变量初始化和static函数
class A {static int si; static void sfunc(){cout<< si;} }; int A::si=0;//静态成员不能在类内初始化. 使用时:int ...
- C++中内置变量的初始化
对于全局的变量 如果内置类型的变量未被显示地初始化,它的值将由定义的位置决定. (1).定义在函数体之外的变量将被初始化为0: (2).定义在函数体内部的变量将不被初始化,它的值将是任意的. 对于(1 ...
- 【Java】变量的分类(作用域,初始值,生命周期)
1. 变量的分类 变量根据在类中定义位置的不同,可以分为两大类: 成员变量:全局变量/字段(Field),不要称之为属性(错误),直接定义在类中,方法外面: (1)类成员变量:使用static修饰符: ...
- DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程
DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程 目录 输出结果 设计思路 核心代码 更多输出 相关文章: ...
- 4修改初始值_Java基础语法 --4(连载)
第一部分 : IDEA开发工具 参见 :IEDA的安装请参考文件夹PPT中的 04_IDEA.ppt 1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1 ...
- 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器...
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...
- python权重初始值设置_pytorch自定义初始化权重的方法
在常见的pytorch代码中,我们见到的初始化方式都是调用init类对每层所有参数进行初始化.但是,有时我们有些特殊需求,比如用某一层的权重取优化其它层,或者手动指定某些权重的初始值. 核心思想就是构 ...
- Java面向对象之成员变量的初始值、object类与对象
一.成员变量初始值 1.测试 class Test06_Num{ //定义一个数据类//在类中定义各种类型的变量,但是不给值int i; byte b;short s;long l;float f;d ...
最新文章
- 在MM32F3273上运行MicroPython,对于性能进行测试
- R语言报错:Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : n行没有x元素
- nvcc 已退出,返回代码为1
- Netty 高性能特性
- 后端技术:mybatis插件原理详解
- php的几种运行模式CLI、CGI、FastCGI、mod_php
- Run ASMX Without IIS
- leetcode 200 python
- 亚马逊新任CEO本周一上任 未来十年将获价值2.1亿美元公司股票
- “庆渝年”​又更新了!法院裁定:禁止李国庆接触、骚扰、殴打俞渝
- jmeter JDBC Request
- [转载] Pytorch入门实战-----逻辑回归识别手写数据集
- 二级分类php代码,php smarty 二级分类代码和模版循环例子
- 防止重复提交表单的两种方法
- 牛腩新闻发布系统(一)
- linux下rfkill命令管理蓝牙和wifi
- 百度地图兴趣点抓取工具
- 使用iso镜像文件创建yum源
- 【小资生活】话剧——无人生还
- python如何获取列表的长度