首页 > 编程语言 >C++11:初始化

C++11:初始化

时间:2022-09-28 18:00:45浏览次数:68  
标签:11 初始化 收窄 int C++ char 编译 std


类内成员初始化

class Mem
{
public:
Mem(int i): m(i){} //初始化列表给m初始化
int m;
};
class Group
{
public:
Group(){}

private:
int data = 1; // 使用"="初始化非静态普通成员,也可以 int data{1};
Mem mem{2}; // 对象成员,创建对象时,可以使用{}来调用构造函数
string name{"mike"};
};

列表初始化

C++11引入了一个新的初始化方式,称为初始化列表(List Initialize),具体的初始化方式如下:

int a[]{1, 3, 5};
int i = {1};
int j{3};

初始化列表可以用于初始化结构体类型,例如:

struct Person  
{
std::string name;
int age;
};

int main()
{
Person p = {"Frank", 25};
std::cout << p.name << " : " << p.age << std::endl;
}

其他一些不方便初始化的地方使用,比如std的初始化,如果不使用这种方式,只能用构造函数来初始化,难以达到效果:

std::vector<int> ivec1(3, 5);  
std::vector<int> ivec2 = {5, 5, 5};
std::vector<int> ivec3 = {1,2,3,4,5}; //不使用列表初始化用构造函数难以实现

防止类型收窄

类型收窄指的是导致数据内容发生变化或者精度丢失的隐式类型转换。使用列表初始化可以防止类型收窄。

int main(void)
{
const int x = 1024;
const int y = 10;

char a = x; // 收窄,但可以通过编译
char* b = new char(1024); // 收窄,但可以通过编译

char c = { x }; // err, 收窄,无法通过编译
char d = { y }; // 可以通过编译
unsigned char e{ -1 }; // err,收窄,无法通过编译

float f{ 7 }; // 可以通过编译
int g{ 2.0f }; // err,收窄,无法通过编译
float * h = new float{ 1e48 }; // err,收窄,无法通过编译
float i = 1.2l; // 可以通过编译

return 0;
}

vs错误提示:

C++11:初始化_初始化


标签:11,初始化,收窄,int,C++,char,编译,std
From: https://blog.51cto.com/u_3002289/5720705

相关文章

  • C++11:移动语义
    为什么需要移动语义#include<iostream>usingnamespacestd;classTest{public:Test(inta=0){//普通构造函数d=newint(a);cout<<"构造函......
  • C++11:std::move和std::forward
    标准库函数std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数......
  • Java11安装(win11)
    下载JDK解压版本下载后解压,并放到一个没有中文路径的目录,如图所示:配置Java环境变量以Windows11系统为例,打开设置,搜索“环境”,点击“编辑系统环境变量”,如图所示:点击......
  • c++可执行文件产生过程
    https://blog.csdn.net/qq_34799070/article/details/125472381#ifndefTEST#defineTEST#include<iostream>usingnamespacestd;voidtest(){cout<<"h......
  • C++问题汇总——长期更新
    避免使用vector<bool>,尽量使用bitset或者deque<bool>因为vector<bool>不是容器,底层是bool值按bit存储STLlist容器数据结构上看是带空头的双向循环链表容器迭代......
  • 视频融合云平台EasyCVR级联时出现报错“Error 1146",是什么原因?
    EasyCVR具备强大的视频接入、汇聚与管理、视频分发、设备管理、用户及角色权限管理等能力。平台可提供的丰富的视频功能,包括:视频监控直播、云端录像、云存储、录像检索与回......
  • 【C++】关于智能指针的简单学习
    智能指针示例类:classString{private: stringm_value;public: String(stringstr):m_value(str){ cout<<"构造"<<m_value<<"\n"; } friendostream&o......
  • c++基本数据类型
    #include<iostream>#include<typeinfo>usingnamespacestd;intmain(){ inti; //定义一个整型变量 cout<<"输入一个整数i:"; cin>>i; cout<<"输出刚才......
  • 深圳工业智能网关BL110实现西门子S7-400 PLC 接入阿里云平台
    LAN接口的配置COM口采集西门子S7-400PLC的配置工业智能网关BL110一共有一个LAN接口,一个WAN接口,可以通过LAN接口采集数据,通过WAN接口接入局域网,设置过程不一样,WAN接口可......
  • 深圳工业智能网关BL110 实现西门子S7-400 PLC接入OPC UA云平台
    LAN接口的配置COM口采集西门子S7-400PLC的配置工业智能网关BL110一共有一个LAN接口,一个WAN接口,可以通过LAN接口采集数据,通过WAN接口接入局域网,设置过程不一样,WAN接口可......