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

C++ 特性使用建议

9.类型转换 不要使用 C 风格类型转换,而应该使用 C++ 风格类型转换。 (1)用 static_cast 替代 C 风格值转换,或某个类指针需要明确向上转换为父类指针时。...(3)如果数据成员在对象构造之后不再发生变化,可将其定义为 const。 13.constexpr 用法 在C++11 里,用 constexpr 来定义真正常量,或实现常量初始化。...C++11 中,若变量被声明成 auto,那它类型就会被自动匹配成初始化表达式类型。您可以用 auto 来复制初始化或绑定引用。...早在 C++03 里,聚合类型(aggregate types)就已经可以被列表初始化了,比如数组和不自带构造函数结构体: struct Point { int x; int y; }; Point...p = {1,2}; C++11 开始,该特性得到进一步推广,任何对象类型都可以被列表初始化

1.6K20

C++特性使用建议

9.类型转换 不要使用 C 风格类型转换,而应该使用 C++ 风格类型转换。 (1)用 static_cast 替代 C 风格值转换,或某个类指针需要明确向上转换为父类指针时。...(3)如果数据成员在对象构造之后不再发生变化,可将其定义为 const。 13.constexpr用法 在 C++11 里,用 constexpr 来定义真正常量,或实现常量初始化。...C++11 中,若变量被声明成 auto,那它类型就会被自动匹配成初始化表达式类型。您可以用 auto 来复制初始化或绑定引用。...早在 C++03 里,聚合类型(aggregate types)就已经可以被列表初始化了,比如数组和不自带构造函数结构体: struct Point { int x; int y; }; Point...p = {1,2}; C++11开始,该特性得到进一步推广,任何对象类型都可以被列表初始化

1.9K30
您找到你想要的搜索结果了吗?
是的
没有找到

constexpr和常量表达式

显然,字面值属于常量表达式,用常量表达式初始化const对象也是常量表达式。...constexpr类型构造函数(除拷贝构造函数外),所有非静态数据成员以及字面值类型基类 或者一个字面值类型数组 上面对于字面值类型定义还牵涉到平凡类型(trivial type),在另一篇博文会讲到...C++11开始,规定允许将变量声明为constexpr类型以便由编译器来验证变量值是否是一个常量表达式。声明为constexpr变量一定是一个常量,而且必须用常量表达式初始化。...int new_sz () {return 24;} constexpr int foo = new_sz(); C++11中关于constexpr函数定义参考链接:cppreference 在C...综合这两点可知,constexpr构造函数体一般来说应该是空,因此对函数成员初始化必须放在初始化列表中。

37210

第6章 函数

在上面两个表达式中,argv是一个数组,它元素是指向 C风格字符串指针,而 argv又可以看成是指向首元素指针,因此 argv就是一个二级指针,所以也就有了第二个表达式写法。...返回一个值方式和初始化一个变量完全一样:返回值用于初始化调用点一个临时量,该临时量就是函数调用结果。...int a = fcn(5); // 上式等价于 int tmp = fcn(5); // 在调用点定义并初始化一个临时量 int a = tmp; // 执行 int类型拷贝构造函数...C++11中规定,函数返回类型及所有形参都得是字面值类型,而且函数体中必须有且只有一条return语句(不过可以通过条件表达式 “?:”和迭代绕过这些限制)。...实参数组函数类型转换成指针。 添加或删除顶层 const属性。 需要进行 const转换(const_cast)。 需要进行类型提升(short--->int)。

1.2K70

Google C++ 编程风格指南(五):其他 C++ 特性

缺点: 恶心语法. 结论: 不要使用 C 风格类型转换. 而应该使用 C++ 风格. 用 static_cast 替代 C 风格值转换, 或某个类指针需要明确向上转换为父类指针时....来定义真正常量,或实现常量初始化。...定义: C++11 中,若变量被声明成 auto, 那它类型就会被自动匹配成初始化表达式类型。您可以用 auto 来复制初始化或绑定引用。...永远别列表初始化 auto 变量。 auto 还可以和 C++11 特性「尾置返回类型(trailing return type)」一起用,不过后者只能用在 lambda 表达式里。 5.20....早在 C++03 里,聚合类型(aggregate types)就已经可以被列表初始化了,比如数组和不自带构造函数结构体: struct Point { int x; int y; }; Point

1.1K30

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

,这使得C++11更像是C++98/03中孕育出一种新语言。...然后: C++11中列表初始化也可以适用于new表达式中 另外: 创建对象时也可以使用列表初始化方式调用构造函数初始化 比如我们之前写过日期类: class Date { public:...,大家看红色圈出来部分,C++11给STL中这些容器增加了这样一个构造函数。 支持用initializer_list类型对象去构造vector这些容器。...initializer_list是C++11引入一种特殊类型,用于简化初始化列表使用。它可以在构造函数函数参数中以列表形式传递一组值。...给它增加这个构造函数就行了 ,每增加之前我们自己vector肯定是不行,而且大家看这个报错,编译器自动就把后面的常量数组识别成initializer list类型了 我们来写一下: 这下我们再来运行

16010

C++】C++11 新特性

函数和运算符重载,引用、常量C++2.0 更加完善支持面向对象,新增保护成员、多重继承、对象初始化、抽象类、静态成员以及const成员函数 C++3.0 进一步完善,引入模板,解决多重继承产生二义性问题和相应构造和析构处理...C++11 增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、右值引用、智能指针、标准线程库等 C++14 对C++11扩展,主要是修复...C++11中漏洞以及改进,比如:泛型lambda表达式,auto返回值类型推导,二进制字面常量C++17 在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()... C++0x 到 C++11C++ 标准十年磨一剑,第二个真正意义上标准珊珊来迟。...,又能表示整形常量;所以出于清晰和安全角度考虑,C++11中新增了关键字 nullptr,用于表示空指针

1.3K10

c++11新特性,所有知识点都在这了!

这里详细介绍请看:左值引用、右值引用、移动语义、完美转发,你知道不知道都在这里 列表初始化C++11中可以直接在变量名后面加上初始化列表来进行对象初始化,详细介绍一定要看这篇文章:学会C++...11列表初始化 std::function & std::bind & lambda表达式 c++11新增了std::function、std::bind、lambda表达式等封装使函数调用更加方便,详细介绍请看...nullptr nullptr是c++11用来表示空指针新引入常量值,在c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型0,其实不是个指针。...const int value = 5; 指针也可以使用const,这里有个小技巧,右向左读,即可知道const究竟修饰指针还是指针所指向内容。...char *const ptr; // 指针本身是常量 const char* ptr; // 指针指向变量为常量函数参数中使用const,一般会传递类对象时会传递一个const引用或者指针,这样可以避免对象拷贝

17.6K22

C++补充知识&C++11及其特性

C++补充知识&C++11及其特性 explicit关键字 加在类构造函数前表明该构造函数是显式,并非隐式,不能进行隐式类型转换! 类构造函数默认情况下声明为隐式。...= ("小美",18);//隐式构造-C++11之前编译不能过 //初始化参数列表C++11新增 看到=要想是赋值呢,还是隐式构造呢。...右值(rvalue)——通过排他性来定义,每个表达式不是左值就是右值,rvalue是不在内存中占有确定位置表达式,而是在存在寄存器中。 所有的左值(无论是数组函数或不完全类型)都可以转化成右值。...(低级别:在内存没啥差别) 与static_cast相加可替换掉C风格类型转换。...在去掉常量限定符之前,保证指针所指向内存可被修改,不能修改则会引起异常。

37810

C++11新关键字

decltype类型推导并不像auto变量声明初始化表达式获得变量类型,而总是以一个普通表达式作为参数,返回该表达式类型,而且decltype并不会对表达式进行求值[2]^{[2]}[2]。...5.constexpr 5.1简介 constexpr在C++11中用于申明常量表达式(const expression),可作用于函数返回值、函数参数、数据申明以及类构造函数等。...: (a)构造函数体必须为空; (b)初始化列表只能使用常量表达式。...(3)常量表达式其他应用 (a)常量表达式作用于函数模板 常量表达式可以作用于函数模板,但是由于函数模板参数不确定性,实例化后模板函数可能不满足常量表达式条件,此时,C++11标准规定,自动忽略...const表达式都是隐含常量表达式(implicit constexpr),直到C++ 11,constexpr才const中细分出来成为一个关键字,而 const1983年C++刚改名时候就存在了

3K10

C++ 异常机制分析

异常对象 异常对象是一种特殊对象,编译器依据异常抛出表达式复制构造异常对象,这要求抛出异常表达式不能是一个不完全类型(一个类型在声明之后定义之前为一个不完全类型。...不完全类型意味着该类型没有完整数据与操作描述),而且可以进行复制构造,这就要求异常抛出表达式复制构造函数(或移动构造函数)、析构函数不能是私有的。...在进行异常对象匹配时,编译器不会做任何隐式类型转换或类型提升。除了以下几种情况外,异常对象类型必须与catch语句声明类型完全匹配: 允许常量常量类型转换。...允许派生类到基类类型转换。 数组被转换成指向数组(元素)类型指针函数被转换成指向函数类型指针。...C++类构造函数初始化列表异常机制,称为function-try block。

1.7K61

C++11新特性学习笔记

终端:g++ xxx.cpp -std=c++11 类型推导 auto auto自动类型推导,用于初始化表达式中推断出变量数据类型。...C 语言中 auto 关键字主要用于自动类型推导,其中变量类型由初始化表达式来推导,并不能隐式声明为指针数组类型。 C++ 中 auto 关键字有着更加广泛用法。...返回语句表达式中不能使用非常量表达式函数、全局数据,且必须是一个常量表达式 常量表达式构造函数有以下限制: 函数体必须为空 初始化列表只能由常量表达式来赋值 3.7 用户定义字面量(vs2013...(){} }; 注意: l 继承构造函数只能初始化基类中成员变量,不能初始化派生类成员变量 l 如果基类构造函数被声明为私有,或者派生类是基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数...这个函数定义次数对于程序员来说,是非常低效。 那C++11如何解决完美转发问题呢?

2.2K20

c++ 11 新特性

auto ci=vi.begin();    C++11 也提供了对象或表达式中“俘获”类型机制,新操作符 decltype 可以从一个表达式中“俘获”其结果类型并“返回”: [cpp]...更惨C++03 中居然不能初始化 POD 数组类成员,也不能在使用 new[] 时候初始 POD 数组,操蛋啊!... deleted 函数   nullptr nullptr 是一个新 C++ 关键字,它是空指针常量,它是用来替代高风险 NULL 宏和 0 字面量。... //指向函数指针   委托构造函数 C++11构造函数可以调用同一个类另一个构造函数: [cpp] view plaincopyprint?...下面介绍一些 C++11 标准库新特性: 线程库 程序员角度来看,C++11 最重要特性就是并发了。

93010

C++11新特性学习笔记

终端:g++ xxx.cpp -std=c++11 类型推导 auto auto自动类型推导,用于初始化表达式中推断出变量数据类型。...C 语言中 auto 关键字主要用于自动类型推导,其中变量类型由初始化表达式来推导,并不能隐式声明为指针数组类型。 C++ 中 auto 关键字有着更加广泛用法。...返回语句表达式中不能使用非常量表达式函数、全局数据,且必须是一个常量表达式 常量表达式构造函数有以下限制: 函数体必须为空 初始化列表只能由常量表达式来赋值 3.7 用户定义字面量(vs2013...(){} }; 注意: l 继承构造函数只能初始化基类中成员变量,不能初始化派生类成员变量 l 如果基类构造函数被声明为私有,或者派生类是基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数...这个函数定义次数对于程序员来说,是非常低效。 那C++11如何解决完美转发问题呢?

2K20

《Effective Modren C++》 进阶学习(上)

而在实际编码中,如何将个人标准愈发完善,愈发得到同事认可,一定需要不断积累。如何积累,一定是细微处着手,观摩优秀代码,学习现有的框架,汲取前人留下智慧。  ...「数组实参」 当数组作为实参,在场景三时,会被转化为指针形式推导。 当数组作为实参,在场景一时,会被推到为数组引用。...对于通用引用推导,左值实参会被特殊对待 对于传值类型推导,实参如果具有常量性和易变性会被忽略 在模板类型推导时,数组或者函数实参会退化为指针,除非它们被用于初始化引用 2....常量表达式是在编译时求值表达式,可用于变量函数构造函数。...constexpr常量可以在编译时被用作常量表达式,例如作为数组大小、模板参数或其他需要常量表达式上下文中使用。这样可以提高代码灵活性和可读性。 编译时错误检查。

16820

第3章 字符串、向量和数组

6.vector中存储元素类型必须可以被赋值,所以元素类型不能是引用和常量。另外,因为新标准中有一个 vector(n, val)构造函数,所以元素类型必须要有默认构造函数。...12.对于内置数组,元素类型和个数都是类型一部分,因此,定义数组时,其维度要是已知,必须为一个常量表达式。    1....与内置类型一样,在函数内部定义内置类型数组,默认初始化会令数组含有未定义值。    2....C++11新标准引入了 begin和 end两个函数,使得内置数组也可以像 STL中容器那样操作迭代器。注意这两个函数不是成员函数,使用时要用数组作为它们参数。    6....14.现代 C++程序应尽量使用 vector和迭代器,避免使用内置数组指针;应该尽量使用 string,避免使用 C风格基于数组字符串。

59860

左值和右值、左值引用与右值引用、移动语句(2)「建议收藏」

它可以是函数名称或取消引用函数指针结果。 C语言还区分它对函数指针和对象指针处理。 另一方面,在C ++中,返回引用函数调用是左值。否则,函数调用是rvalue表达式。...转换后类型也不合格 常量 要么 挥发物。 将亡值 在C++11之前右值和C++11纯右值是等价C++11将亡值是随着右值引用引入而新引入。...在C++11中,我们用左值去初始化一个对象或为一个已有对象赋值时,会调用拷贝构造函数或拷贝赋值运算符来拷贝资源(所谓资源,就是指new出来东西),而当我们用一个右值(包括纯右值和将亡值)来初始化或赋值时...事实上,将亡值不过是C++11提出一块晦涩语法糖。它与纯右值在功能上及其相似,如都不能做操作符左操作数,都可以使用移动构造函数和移动赋值运算符。...而在move版本构造函数或赋值函数内部,都是直接“移动”了其内部数据指针(因为它是非常量右值,是一个临时对象,移动了其内部数据指针不会导致任何问题,它马上就要被销毁了,我们只是重复利用了其内存),

2.5K20

每个C++开发者都应该学习和使用C++11特性

unsetunset2、nullptrunsetunset 在 C++11 中引入了 nullptr,用于表示空指针常量。...在传统 C++ 中,空指针可以用 NULL 宏或者字面常量 0 表示。...NULL 和 0 都可以隐式地转换为整数类型,可能引入一些不符合预期行为。 为了解决这些问题,C++11 引入了 nullptr,它是一个明确指针常量,不具有整数类型,可以显式地表示空指针。...此外,C++标准库还提供了其他智能指针,如 std::auto_ptr(在C++11已弃用)、std::scoped_ptr(C++11之前实现)、std::unique_ptr数组版本std::unique_ptr...unsetunset7、匿名函数unsetunset Lambda表达式C++11引入一种新语法特性,用于创建匿名函数,它提供了一种更加灵活和方便方式来编写内联函数对象。

5110
领券