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

· 浏览次数 : 8

小编点评

C++11引入了使用{}来初始化对象,这样初始化一个对象有如下几种方法: 1. **禁止变窄转换**:`{}`可以用来初始化对象,但它会阻止变窄转换。例如,`int a = 1.2`的编译错误中会包含`{}`。 2. **适配std::initializer_list参数的构造函数**:`{}`可以用来初始化`std::initializer_list`参数的构造函数。`std::initializer_list`是一种可以用于初始化一组特定类型的对象的新构造函数。 3. **调用无参构造函数语义更加明确**:`{}`可以用来初始化无参构造函数,这比圆括号更易于理解。 **具体而言,`{}`的意义如下:** * **优先适配`std::initializer_list`参数的构造函数**:当构造函数的参数是`std::initializer_list`时,`{}`会优先被使用。 * **当`std::initializer_list`参数的构造函数无法满足初始化所有对象的条件时**,会使用默认构造函数进行初始化。 * **当`std::initializer_list`参数的构造函数无法满足初始化所有对象的条件时**,会使用默认构造函数进行初始化。 **需要注意的是,`{}`会优先适配`std::initializer_list`参数的构造函数,即使`std::initializer_list`的参数只有一个值。** 例如下面的代码: ```cpp std::vector vec1{1,2,3,4}; std::vector vec2(1,2,3,4); ``` 会产生不同的输出,因为`vec2`的构造函数会优先使用`std::initializer_list`参数的构造函数。

正文

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;
}

与初始化使用花括号还是圆括号?相似的内容:

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

C++11引入了使用{}来初始化对象,这样初始化一个对象有如下几种方法: class MyClass { public: int value; MyClass(int _val):value(_val){} }; int main() { MyClass cls1(1); MyClass cls2{

map 简单梳理【GO 基础】

map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。比较容易混淆,本文来梳理下。

JVM内存学习 2.0

先说一下结果 1. Linux的内存分配是惰性分配的. APP申明了 kernel并不会立即进行初始化和使用. 2. JVM的内存主要分为, 堆区, 非堆区, 以及jvm使用的其他内存. 比如直接内存等. 3. top看到的内存与pmap 查询出来的内存基本一样. top的RES和pmap的RSS基

基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理

在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间,这样验证短信验证码的时候,就会自动判断是否过期了。本篇随笔结合CSRedis的使用,介绍如何实现缓存的初始化及使用的处理。

Xposed 原理

Xposed 使用替换app_process的方式(这是个二进制文件) xposed 的 app_main2.cpp中做了xposed的初始化 /** Initialize Xposed (unless it is disabled). */ bool initialize(bool zygote,

为什么我推荐你使用 systemd timer 替代 cronjob?

概述 前几天在使用 Terraform + cloud-init 批量初始化我的实验室 Linux 机器。正好发现有一些定时场景需要使用到 cronjob, 进一步了解到 systemd timer 完全可以替换 cronjob, 并且 systemd timer 有一些非常有趣的功能。 回归话题:

[转帖]initdb命令 – 初始化PostgreSQL数据库

https://www.xtuos.com/2202.html 使用initdb命令可以在安装完PostgreSQL服务器所需软件包之后,初始化一个PostgreSQL数据库簇。 语法格式: initdb [参数] [目录] 常用参数: -U 指定数据库超级用户名 -W 对于新的超级用户提示输入口令

[转帖]tidb4.0.4使用tiup扩容TiKV 节点

https://blog.csdn.net/mchdba/article/details/108896766 环境:centos7、tidb4.0.4、tiup-v1.0.8 添加两个tikv节点 172.21.210.37-38 思路:初始化两台服务器、配置ssh互通——>编辑配置文件——>执行扩

VUEX 的使用学习二: state

转载请注明出处: state 提供唯一的数据资源,所有的共享的数据都要统一放到store 中的state中进行存储; 状态state用于存储所有组件的数据。 管理数据 // 初始化vuex对象 const store = new vuex.Store({ state: { // 管理数据 count

Springboot简单功能示例-2 KEY初始化功能和全局错误处理

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】KEY初始化功能和全局错误处理