首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 0x中的统一初始化,何时使用()而不是{}?

在 C++ 0x 中,统一初始化允许使用圆括号 () 和花括号 {} 来初始化变量。但是,在某些情况下,只能使用圆括号 (),而不能使用花括号 {}。

具体来说,当初始化的对象是一个非聚合类型,并且该类型没有提供初始化列表时,只能使用圆括号 ()。这是因为圆括号 () 可以用来表示值的列表,而花括号 {} 则用于表示初始化列表。

例如,考虑一个类型为 std::vector<int> 的变量,由于该类型没有提供初始化列表,因此只能使用圆括号 () 进行初始化:

代码语言:cpp
复制
std::vector<int> v(3, 4); // 使用圆括号 () 初始化

而如果该类型提供了初始化列表,则可以使用花括号 {} 进行初始化:

代码语言:cpp
复制
std::vector<int> v{3, 4, 5}; // 使用花括号 {} 初始化

需要注意的是,当使用花括号 {} 初始化时,如果初始化列表中只有一个元素,则需要在该元素后面加上逗号,以避免与圆括号 () 的初始化方式混淆:

代码语言:cpp
复制
std::vector<int> v{3,}; // 使用花括号 {} 初始化,注意逗号

总之,在 C++ 0x 中,统一初始化允许使用圆括号 () 和花括号 {} 来初始化变量,但在某些情况下,只能使用圆括号 (),而不能使用花括号 {}。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中关于指针初始化和使用NULL的理解

1、严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置。   ...(1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明的指针刚好指向程序代码的位置会导致一些很隐蔽的错误。    (2)未被初始化之前禁止指针之间的赋值。...2、对NULL的理解 一开始想不明白:如果给一个指针初始化成NULL之后不是就代表,指针指向一块内存单元了吗,那应该可以直接往里面填值,可是实际却不可以。...引用网友win_hate在话题“关于NULL的不严谨”中的话来说:“如果说有谁不严谨了,那必定是读取0位置的程序员,而不是C。...所以NULL就像安全带,将指针悬空,避免程序员因为大意而犯下一些不必要的错误。

2.8K100
  • C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本

    天人菊 T.5: Combine generic and OO techniques to amplify their strengths, not their costs T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本...泛型和面向对象技术是互补的。...静态协助动态:使用静态多态技术实现动态多态接口。...动态帮助静态:提供通用,舒适的静态边界的接口,但是内部进行动态分发,这样就可以提供一致的对象布局。示例代码引入了和std::shared_ptr的删除器一样的类型消除机制。...在类模板中,非虚函数只有在被使用时才会实例化-但是虚函数任何时候都会实例化。这会使代码膨胀,并且因为实例化根本不用的功能而过度约束通用类型。要避免这个问题,即使标准库有时也会犯这样的错误。

    58820

    C++11(1)

    但是到 06 年的时候,官方觉得 2007 年肯定完不成 C++ 07 ,而且官方觉得 2008 年可能也 完不成。最后干脆叫 C++ 0x 。...这里是C++11的具体内容C++11 - cppreference.com,有兴趣的可以看看; 统一的列表初始化 1.{}初始化 在 C++98 中,标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定...这两个{}本质上是不一样的,date d的{}会调用它的构造函数初始化d,而date类中只有三个参数,所以{}中只能有3个数;但是vector就不一样了,vector的{}中的元素数量是可变化的,并不是固定的三个...;同样其他的容器list等也是如此;因此传递的参数是一个数组来进行初始化;为了方便统一,所以就出现了initializer_list的数组容器来统一作为数组参数; std::initializer_list...:这是在C++文件中的一段代码,两个函数的参数分别是int和int*,当实参是NULL时是可以调用第一个函数的,因为C中define了NULL是0;如果要调用第二个函数是不是就需要传实参为指针类型,我们就需要传参数

    4500

    C++11基础学习系列一

    ---- 概述 C++11标准越来越趋于稳定和成熟,国外c++11如火如荼而国内却依然处于观望期。每当提到C++很多程序员都很抵触,特别是学术界的呼声更高一些。...初始化与赋值 在C++中初始化是创建变量并赋予初始值因此叫初始化,赋值操作是更新对象值即将右值更新到操作符左侧对象中。...C++11新增了列表初始化,由花括号括起来,如下: int a = {12}; int b{12}; 声明与定义 在C++中如果在代码中使用变量,必须先声明该变量。...定义是指在初次使用变量时就需要定义变量。变量可以多次声明,但只能定义一次。 Complex Type C++ 中的复合类型(Complex Type)有引用、指针、类等。...decltype使用的表达式不是一个变量时,则返回表达式结果对应的类型。

    93040

    C++系列笔记(二)

    【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等...声明指针如下: int *pInteger = NULL; #初始化指针 使用引用运算符(&)获取变量的地址 可以声明一个int指针来储存变量的地址: int* pInteger = &age...new分配的内存最终都需要使用对应的delete进行释放 delete Pointer; delete[] Pointer PS: delete只能释放new创建的内存,而不是用于包含任何地址的内存。...= 24; const int* const pInteger = & HoursInDay 务必初始化指针变量,如果不能将指针初始化为new返回的有效地址或它有效变量,可将其初始化为NULL。...检查使用new发出的分配请求是否得到满足 C++提供了两种确保指针有效的方法,默认方法是使用异常,即如果内存分配失败,将引发std::bad_alloc异常。这将导致应用程序中断执行。

    20020

    关于堆栈的讲解(我见过的最经典的)

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。...另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。...cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。...那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。...了解C++的朋友都知道,C++可以使用new关键字来动态分配内存。

    2.5K20

    【一通百通】CC++的std标准总结

    C/C++发展很多版本标准,sunsky(本人)早就想理理std标准了,让大家有个清晰的了解。...当然,您不希望在ISO C程序中使用它们,但将它们放在可能包含在编译完成的头文件中是有用的-ㄧ。备用的预定义宏,如__unix__和__vax__也可用,有或没有-ㄧ的。...例如, -std = c90关闭那些不符合ISO C90 GCC的某些功能,比如asm和typeof 关键字,而不是其他GNU扩展没有在ISO C90意义,如省略的中期?: 表现。...例如 -std = gnu90 -Wpedantic 警告C ++风格'//“评论,而 -std = gnu99 -Wpedantic 才不是。...另外,请大家请注意下,C几乎上不再更新了,慢慢转向C++的统一(这话是国外c/cpp论坛的),大家有空多关注C++14/17的发展吧,新特性还是能振奋人心的。

    1.1K30

    关于byte[]字节传输的大端和小端小议

    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian...endian的格式存放数据,而motorola系列的CPU采用的是big endian,ARM则同时支持 big和little,网络编程中,TCP/IP统一采用大端方式传送数据,所以有时我们也会把大端方式称之为网络字节序...特别需要注意的是,C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而 JAVA编写的程序则唯一采用big endian方式来存储数据。这里我就只讨论C/C++语言的情况。...main(void ){ unsigned int x =0x12345678; unsigned char *p = (unsigned char *)&x; printf("%0x...%0x %0x %0x",p[0],p[1],p[2],p[3]); return 0; }    --------------鸣谢(NULL)作者,本篇文章只供自己学习,若原始作者能够有建议,

    1.5K50

    C++奇迹之旅:列表初始化和std::initializer_list(C++11第一篇)

    但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。...统一的列表初始化 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。...new表达式中 int* pa = new int[4]{ 0 }; return 0; } 创建对象时也可以使用列表初始化方式调用构造函数初始化 struct Point { int _x;...: std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。

    10510

    【C++修炼之路】26.C++11(语法糖)

    但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也 完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。...二.统一的列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。...而开辟的空间就是根据std::initializer_list的size()大小开辟的。...C++11中废弃auto原来的用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。 实际上在C++初窥门径中已经学习过。

    44000

    【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

    但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。...统一的列表初始化 首先声明一下: 这个列表初始化和我们类和对象那里学的初始化列表不是一个概念,是不同的。...2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...然后: C++11中列表初始化也可以适用于new表达式中 另外: 创建对象时也可以使用列表初始化方式调用构造函数初始化 比如我们之前写过的日期类: class Date { public:...initializer_list是C++11引入的一种特殊类型,用于简化初始化列表的使用。它可以在构造函数或函数参数中以列表的形式传递一组值。

    22910

    C++系列笔记(三)

    【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等...Human Tom; Tom.DateBirth="1970"; 使用指针运算符(->)访问成员 如果对象是使用new在自有储存区中实例化的,或者有指向对象的指针,则可以使用指针运算符(->)来访问成员属性和方法...例如:Human::DateOfBirth指的是在Human类中声明的变量DateOfBirth,而::DateOfBirth表示全局作用域中的变量DateOfBirth。...: Name(InputName) , Age(InputAge) { //代码 } }; 初始化列表由包含在括号当中的参数声明后面的冒号标识,冒号后面列出了各个成员变量及其初始化值...深复制:所以要将浅复制的参数复制变成地址传递,即按参数引用传递而不是进行二进制复制。

    21910

    C++ Primer Plus 第03章 数据处理 学习笔记

    C++中,不同的整型使用不同的内存量,使用的内存越大,可表示的数值范围越大。...要知道系统中整数的最大长度,可以使用C++工具来检查类型的长度。 首先使用sizeof运算符返回类型或变量的长度,单位为字节。 climits中包含符号常量(预处理方式)来表示类型的限制。...C / C++中的三种计数方法: 十进制(第一位为1~9,基数为10)----> dec 八进制(第一位为0,基数为8) ----> oct 十六进制(前两位以0x或0X开头,基数为16,0~9和a~f...指数为负数意味着除以10的乘方,而不是乘以10的乘方。...强制转换的通用格式如下: (typename) value //来源于C语言 typename (value) // C++ 4.4 C++11中的auto声明 在初始化声明中,如果使用关键字auto

    85000

    C++数据类型

    Union) 自定义数据结构:用struct或者class定义的类 POD:Plain Old Data,用来表明C++中和C相兼容的数据类型,在C++中可以用is_pod::value判断是否是...内置类型 Tips:C++中整型大小因编译器和操作系统的不同而不同,通常人们假定short是16位,int是32位,long是32位,long long是64位。...实际开发中我们仅使用C++内置整型中的int,如果程序中需要大小不同的整型,那么: 在合适情况下,推荐用size_t和ptrdiff_t 我们可以认为int至少32位,如果需要使用64位整数,那么使用...因为无法令引用重新绑定到另一个对象,因此引用必须初始化 因为引用不是一个对象,所以不能定义引用的引用 指针 指针是指向(point to)另外一种类型的复合类型。 1....使用未经初始化的指针是引发运行时错误的一大原因,如果使用了未经初始化的指针,那么指针所占空间的当前内容将被当成一个地址值,当这个地址值指向的内存空间中正好有内容时,就可能引发难以预料的后果。

    96520

    C++初始化的坑你也遇到过吗?

    谈及C++的初始化,我们都知道要在变量定义的时候给它赋初值。确实,在每次定义的时候就初始化不仅可以避免脏数据产生,还能增加代码的可读性。但是,你知道这其中有多少陷阱吗?...,但a,c都被赋予了默认值,而b是不确定的值。...段中,即完成变量的初始化。...所以,这个坑其实是C++初始化列表的坑,初始化列表的定义中说明,如果初始化列表的数量比定义的数量少,那么未被定义到的值将会被赋予默认值!...首先,在我的设备上,int是4字节,所以buff_2总共40字节,memset会对40个1字节赋值0X01,而不是对10个4字节赋值0X01。所以不要用memset对非字符型数组赋初值!

    45530

    《C++ primer》--第1,2章小结

    5、C++中,把负值赋给unsigned对象是合法的,其结果是该负数对该类型的取值个数求模后的值,如果把-1赋给8位的unsigned char 那么结果就是255。...C++中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储与该内存中的值的取值范围以及可运用在该变量上的操作集。     2.C++关键字 ?...例如通常写成index而不是Index或者INDEX 标识符应使用能帮组记忆的名字 包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写 9、变量的初始化    有两种初始化方式...可以通过使用extern关键字声明变量名而不定义他。...赋值为1,其他的是隐式初始化依次为2,3,4    3.每个enum都定义一种唯一类型 15、头文件: 头文件用于声明而不是用于定义(头文件包含在多个源文件中,所以不应该含有变量或者函数的定义,有三个例外

    889100

    Java的数据类型

    注:引用数据类型的大小统一为 4 个字节,记录的是其引用对象的地址! 整型变量 概要 整型用于表示没有小数部分的数值,它允许是负数。...整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。于此相反,C和C++程序需要针对不同的处理器选择最有效的整形。...十六进制数,要求 0x 或 0X 开头,如:0x15 。...二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。...属性用于定义该类或该类对象包含的数据。 2. 属性作用范围是整个类体。 3. 属性的默认初始化: 在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。

    97610

    iOS内存管理:从MRC到ARC实践

    self.name = @"qqstock"; _name = @"qqstock"; 不知道是不是所有从 C/C++ 转过来的程序员都遇到过类似的迷惑和愤怒。...与 C/C++ 传统的内存管理方式相比,MRC 是不是显得非常智能?是不是更加方便?...首先,强引用依然保留 MRC 的方式,因为这样实现的方式代价很低; 其次,一旦出现弱引用,则将内存对象在系统中建立映射表;一旦内存对象因为所有强引用归零而释放,则将所有弱引用指针归零(指向 nil)——...首先:使用 retain 类型初始化方法给 weak 和 assign 类型变量赋值时,编译器会报警。 ?...还有,各种类方法初始化的 autorelease 对象,依然是在 runloop 结束的时候析构的,而 retain 类型的对象,却是在代码模块终止的时候析构的。

    1.2K50

    堆和栈的区别

    了解C++的朋友都知道,C++可以使用new关键字来动态分配内存。...(共 9 页) 前言 您是否是动态分配的 C/C++ 对象忠实且幸运的用户?您是否在模块间的往返通信中频繁地使用了“自动化”?您的程序是否因堆分配而运行起来很慢?不仅仅您遇到这样的问题。...部分) 在程序中,使用堆来动态分配和释放对象。在下列情况下,调用堆操作:  事先不知道程序所需对象的数量和大小。 对象太大而不适合堆栈分配程序。...某些情况下,这些堆是操作系统堆中的层,而语言运行时堆则通过大块的分配来执行自己的内存管理。不使用操作系统堆,而使用虚拟内存函数更利于堆的分配和块的使用。 典型的堆实现由前、后端分配程序组成。...它能够使用一套参数进行初始化,这些参数表示并发级别、对象大小和保持在空闲列表中的元素的数量等。分配高速缓存处理程序对象维持自己的私有空闲实体池(不超过指定的阀值)并使用私有保护锁。

    1.3K90
    领券