首页 > 其他分享 >初始化使用花括号还是圆括号?

初始化使用花括号还是圆括号?

时间:2024-04-25 14:22:52浏览次数:22  
标签:初始化 int 适配 list 圆括号 initializer 括号 MyClass 构造函数

C++11引入了使用{}来初始化对象,这样初始化一个对象有如下几种方法:

class MyClass
{
public:
    int value;
    MyClass(int _val):value(_val){}
};

int main()
{
    MyClass cls1(1);
    MyClass cls2{ 1 };
    MyClass cls3 = { 1 };//会调用默认拷贝函数
    MyClass cls4 =  1 ;//会调用默认拷贝函数

    MyClass* p1 = new MyClass(1);
    MyClass* p2 = new MyClass{ 1 };
   delete p1;
    delete p2;
    return 0; 
}

实际上,就是增加了一种调用构造函数的形式,以前是圆括号,现在增加了花括号。

那么引入{}的意义是什么呢?

1.禁止变窄转换;2.适配std::initializer_list参数的构造函数;3.调用无参构造函数语义更加明确

class MyClass
{
public:
    int value;
    MyClass(int _val):value(_val){}
    MyClass() {}
};

int main()
{
    MyClass cls1(1.2);//ok
    MyClass cls2{ 1.2 };//变窄转换,编译错误
    MyClass cls3();//语义可以理解函数声明,函数名为cls3,返回值为MyClass类型,无参
    MyClass cls4{};//语义更加明确
    return 0;
}
class MyClass
{
public:
    MyClass(std::initializer_list<int>_list) {}
};

int main()
{
    MyClass cls1{ 1,2,3,4 };    //适配initializer_list参数的构造函数
    std::vector<int>vec{1,2,3,4};//适配initializer_list参数的构造函数
    return 0;
}

但要注意的是,{}会优先适配initializer_list参数的构造函数,例如下面的区别:

int main()
{
    std::vector<int>vec1{ 1,4 };//适配initializer_list参数的构造函数
    std::vector<int>vec2(1,4);
    return 0;
}

标签:初始化,int,适配,list,圆括号,initializer,括号,MyClass,构造函数
From: https://www.cnblogs.com/hosseini/p/18157633

相关文章

  • P7914 [CSP-S 2021] 括号序列
    P7914[CSP-S2021]括号序列看起来非常复杂的括号题,看到数据范围,大概确定是区间dp,所以我们考虑怎么定义状态。条件非常多,所以二维的状态肯定表示不了,考虑多加一维来定义不同的状态。\(dp_{i,j,0}\):区间形式是***...***的方案数。\(dp_{i,j,1}\):区间形式是(...)的方案数......
  • 进程与服务器初始化
    1.如何查看进程是否已经开启?systemctlstatus进程名psaux/-elf|grep进程名netstat/ss-lntup|grep进程名/:端口lsof-i:端口2.如何通过端口查看进程号?netstat-lntup|grep:端口ss-lntup|grep:端口lsof-i:端口3.对新服务器做过哪些初始化操作?安装操作......
  • Spring 源码阅读(二)IoC 容器初始化以及 BeanFactory 创建和 BeanDefinition 加载过程
    相关代码提交记录:https://github.com/linweiwang/spring-framework-5.3.33IoC容器三种启动方式XMLJavaSE:ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml")ApplicationContextcontext=newFileSystemXmlApplicationContext("C:/beans......
  • rt-thread rtc 时间乱跳,初始化失败等问题
    添加rtc组件步骤,系统版本4.1.11.rt-threadsettings中添加rtc2.board.h中打开rtc的开关  #defineBSP_USING_ONCHIP_RTC3.stm32g0xx_hal_conf.h 打开rtc选项  #defineHAL_RTC_MODULE_ENABLED4.rt-thread\components\drivers\rtc\rtc.c中注释掉与drv_rtc.c中冲突的代......
  • 1249. 移除无效的括号(stack)
      给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。请返回任意一个合法字符串。有效「括号字符串」应当符合以下 任意一条 要求:空字符串或只包含......
  • 一次性初始化/重新挂载/便捷类型/优化技巧
    React中一次性初始化在React中进行一次性初始化的两种推荐方案如下:方案1使用useState进行初始化:javascriptCopycodeconst[resource]=React.useState(()=>newResource());这种方法通过状态的惰性初始化来创建资源,代码直观且易于理解。方案2使用useRef保持实例不变......
  • 栈3: 括号匹配
    栈3:括号匹配自定义数据结构typedefstructMYCHAR{LinkNodenode;char*pAddres;//数据域intindex;//}MyChar;判断左右括号intIsLeft(charc){returnc=='(';}intIsRight(charc){returnc==')';}创建栈结点MyChar*CreatMyChar(c......
  • C++ - 中必须使用初始化列表初始化的四种情况
    1.必须使用初始化列表初始化一个引用成员;classCBase{public:CBase(inta):m_a(a)//正确,m_a是一个变量的引用,必须通过初始化列表初始化{//m_a=a;//错误cout<<"m_a:"<<m_a<<endl;}public:int&m_a;}; 2.......
  • Ubuntu系统初始化
    修改root密码sudopasswdsuroot网卡管理#自动获取IPdhclientens33安装sshsudoaptupdatesudoaptinstallopenssh-serversudosystemctlstatussshd防火墙管理#Ubuntu自带一个配置防火墙配置工具,称为UFW。如果防火墙在你的系统上被启用,请确保打开了......
  • 洛谷题单指南-数学基础问题-P2651 添加括号III
    原题链接:https://www.luogu.com.cn/problem/P2651题意解读:计算能否在除法a1​/a2​/a3​/.../an​式子中加括号,将一部分数变成分子,使得除法结果是整数。解题思路:在a1​/a2​/a3​/.../an​中,无论怎么加括号,a1一定是分子,a2一定是分母,那么可以判断把a3...an都作为分子,是否能除尽......