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 开始,该特性得到进一步的推广,任何对象类型都可以被列表初始化。
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开始,该特性得到进一步的推广,任何对象类型都可以被列表初始化。
显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。...constexpr类型的构造函数(除拷贝构造函数外),所有非静态的数据成员以及字面值类型的基类 或者一个字面值类型的数组 上面对于字面值类型的定义还牵涉到平凡类型(trivial type),在另一篇博文会讲到...从C++11开始,规定允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。...int new_sz () {return 24;} constexpr int foo = new_sz(); C++11中关于constexpr函数的定义参考链接:cppreference 在C...综合这两点可知,constexpr构造函数体一般来说应该是空的,因此对函数成员的初始化必须放在初始化列表中。
在上面两个表达式中,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)。
缺点: 恶心的语法. 结论: 不要使用 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
,这使得C++11更像是从C++98/03中孕育出的一种新语言。...然后: C++11中列表初始化也可以适用于new表达式中 另外: 创建对象时也可以使用列表初始化方式调用构造函数初始化 比如我们之前写过的日期类: class Date { public:...,大家看红色圈出来的部分,C++11给STL中的这些容器增加了这样一个构造函数。 支持用initializer_list类型的对象去构造vector这些容器。...initializer_list是C++11引入的一种特殊类型,用于简化初始化列表的使用。它可以在构造函数或函数参数中以列表的形式传递一组值。...给它增加这个构造函数就行了 ,每增加之前我们自己的vector肯定是不行的,而且大家看这个报错,编译器自动就把后面的常量数组识别成initializer list类型了 我们来写一下: 这下我们再来运行
函数和运算符重载,引用、常量等 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++11,C++ 标准十年磨一剑,第二个真正意义上的标准珊珊来迟。...,又能表示整形常量;所以出于清晰和安全的角度考虑,C++11中新增了关键字 nullptr,用于表示空指针。
这里的详细介绍请看:左值引用、右值引用、移动语义、完美转发,你知道的不知道的都在这里 列表初始化 在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的引用或者指针,这样可以避免对象的拷贝
C++补充知识&C++11及其特性 explicit关键字 加在类构造函数前表明该构造函数是显式的,并非隐式的,不能进行隐式类型转换! 类构造函数默认情况下声明为隐式。...= ("小美",18);//隐式构造-C++11之前编译不能过 //初始化参数列表C++11新增 看到=要想是赋值呢,还是隐式构造呢。...右值(rvalue)——通过排他性来定义,每个表达式不是左值就是右值,rvalue是不在内存中占有确定位置的表达式,而是在存在寄存器中。 所有的左值(无论是数组,函数或不完全类型)都可以转化成右值。...(低级别:在内存没啥差别) 与static_cast相加可替换掉C风格的类型转换。...在去掉常量限定符之前,保证指针所指向的内存可被修改,不能修改则会引起异常。
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中细分出来成为一个关键字,而 const从1983年C++刚改名的时候就存在了
异常对象 异常对象是一种特殊的对象,编译器依据异常抛出表达式复制构造异常对象,这要求抛出异常表达式不能是一个不完全类型(一个类型在声明之后定义之前为一个不完全类型。...不完全类型意味着该类型没有完整的数据与操作描述),而且可以进行复制构造,这就要求异常抛出表达式的复制构造函数(或移动构造函数)、析构函数不能是私有的。...在进行异常对象的匹配时,编译器不会做任何的隐式类型转换或类型提升。除了以下几种情况外,异常对象的类型必须与catch语句的声明类型完全匹配: 允许从非常量到常量的类型转换。...允许派生类到基类的类型转换。 数组被转换成指向数组(元素)类型的指针。 函数被转换成指向函数类型的指针。...C++类构造函数初始化列表的异常机制,称为function-try block。
终端:g++ xxx.cpp -std=c++11 类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。...C 语言中的 auto 关键字主要用于自动类型推导,其中变量的类型由初始化表达式来推导,并不能隐式声明为指针或数组类型。 C++ 中的 auto 关键字有着更加广泛的用法。...返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式 常量表达式的构造函数有以下限制: 函数体必须为空 初始化列表只能由常量表达式来赋值 3.7 用户定义字面量(vs2013...(){} }; 注意: l 继承的构造函数只能初始化基类中的成员变量,不能初始化派生类的成员变量 l 如果基类的构造函数被声明为私有,或者派生类是从基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数...这个函数的定义次数对于程序员来说,是非常低效的。 那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 最重要的特性就是并发了。
而在实际编码中,如何将个人的标准愈发完善,愈发得到同事的认可,一定需要不断积累。如何积累,一定是从细微处着手,观摩优秀的代码,学习现有的框架,汲取前人留下的智慧。 ...「数组实参」 当数组作为实参,在场景三时,会被转化为指针形式推导。 当数组作为实参,在场景一时,会被推到为数组的引用。...对于通用引用的推导,左值实参会被特殊对待 对于传值类型推导,实参如果具有常量性和易变性会被忽略 在模板类型推导时,数组或者函数实参会退化为指针,除非它们被用于初始化引用 2....常量表达式是在编译时求值的表达式,可用于变量函数和构造函数。...constexpr常量可以在编译时被用作常量表达式,例如作为数组大小、模板参数或其他需要常量表达式的上下文中使用。这样可以提高代码的灵活性和可读性。 编译时错误检查。
6.vector中存储的元素类型必须可以被赋值,所以元素类型不能是引用和常量。另外,因为新标准中有一个 vector(n, val)的构造函数,所以元素类型必须要有默认构造函数。...12.对于内置数组,元素类型和个数都是类型的一部分,因此,定义数组时,其维度要是已知的,必须为一个常量表达式。 1....与内置类型一样,在函数内部定义的内置类型的数组,默认初始化会令数组含有未定义的值。 2....C++11新标准引入了 begin和 end两个函数,使得内置数组也可以像 STL中的容器那样操作迭代器。注意这两个函数不是成员函数,使用时要用数组作为它们的参数。 6....14.现代的 C++程序应尽量使用 vector和迭代器,避免使用内置数组和指针;应该尽量使用 string,避免使用 C风格的基于数组的字符串。
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。...相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。...,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。...3.nullptr 由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。...2.类成员变量初始化 C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化。
它可以是函数的名称或取消引用函数指针的结果。 C语言还区分它对函数指针和对象指针的处理。 另一方面,在C ++中,返回引用的函数调用是左值。否则,函数调用是rvalue表达式。...转换后的类型也不合格 常量 要么 挥发物。 将亡值 在C++11之前的右值和C++11中的纯右值是等价的。C++11中的将亡值是随着右值引用的引入而新引入的。...在C++11中,我们用左值去初始化一个对象或为一个已有对象赋值时,会调用拷贝构造函数或拷贝赋值运算符来拷贝资源(所谓资源,就是指new出来的东西),而当我们用一个右值(包括纯右值和将亡值)来初始化或赋值时...事实上,将亡值不过是C++11提出的一块晦涩的语法糖。它与纯右值在功能上及其相似,如都不能做操作符的左操作数,都可以使用移动构造函数和移动赋值运算符。...而在move版本的构造函数或赋值函数内部,都是直接“移动”了其内部数据的指针(因为它是非常量右值,是一个临时对象,移动了其内部数据的指针不会导致任何问题,它马上就要被销毁了,我们只是重复利用了其内存),
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引入的一种新的语法特性,用于创建匿名函数,它提供了一种更加灵活和方便的方式来编写内联的函数对象。
二.统一的列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...+11支持这样初始化 Point* p5 = new Point[2]{ {1, 1}, {2, 2} }; Date d3{ 1,3,2 }; } 对于Date类型,c++11的方式同样调用构造函数...作为参数的构造函数,这样初始化容器对象就更方便了。...也可以作为operator=的参数,这样就可以用大括号赋值。因此我们就知道了为什么vector类的空间是如何初始化的,vector的构造函数就存在std::initializer_list的参数。...智能指针、lambda表达式、包装器、线程库、可变参数模板……。
领取专属 10元无门槛券
手把手带您无忧上云