1. C++11标准中让类的析构函数默认也是noexcept(true)的。 但如果显式地为析构函数指定了noexcept,或者类的基类或成员有noexcept(false)的析构函数,析构函数就不会再保持默认值。

2. 初始化成员变量:

c++98中,支持在类声明中使用等号“=”进行初始化,但要求必须为静态成员常量,而且也只能是整形或枚举类型才能初始化。

而在c++11中,允许使用等号或花括号进行非静态成员变量的初始化,比如:

struct init{ int a = ; double b {1.2}; }

上述代码中,给非静态成员a和b分别赋予初值1和1.2.

若同时使用就地初始化和初始化列表两种方式,结果是初始化列表后作用于非静态成员,即最终所赋值的是初始化列表中的值。

3. 扩展的friend语法:

class Poly;
typedef Poly P; class LiLei {
friend class Poly; // c++98通过,c++11通过
}; class Jim {
friend Poly; //c++98失败,c++11通过
}; class HanMeiMei {
friend P; //c++98失败,c++11通过
};

c++11在声明一个类为另一个类友元时,不再需要使用class关键字,或者使用别名。

这样可以为类模板声明友元:

class P;

template <typename T> class People {
friend T;
}; People<P> PP; //类型P在这里是People类型的友元
People<int> Pi; //对于int类型模板参数,友元声明被忽略

4. c++11中阻止一个函数在派生类中被重载,使用final:

class Object {
virtual void fun() = ;
}; class Base: public Object {
void fun() final;
}; class Derived: public Base {
void fun(); //无法通过编译
};

在类Base中将函数fun()声明为final,那么派生于Base的Derived类则不能重载fun()。

若在派生类中在虚函数声明时使用override,表明该函数必须重载其基类中能的同名函数:

class Base {
virtual void Turing() = ;
virtual void Dijkstra() = ;
virtual void VNeumann(int g) = ;
void print();
}; class Derived: public Base {
void Turing() override;
void Dikjstra() override; //无法通过编译,拼写错误
void VNeumann(double g); //无法通过编译,参数不一致
void print() override; //无法通过编译,非虚函数重载
};

若没有override修饰符,则Derived则会通过编译,但并没有实现想要重载的功能。

5. 模板函数的默认模板参数

在c++98中函数模板不能有默认参数,而在c++11中则可以有:

void DefParm(int m = ) {}  //c++98通过编译,c++11通过编译

template <typename T = int>
class DefClass {}; //c++98通过编译,c++11通过编译 template <typename T = int>
void DefTempParm() {}; //c++98编译失败,c++11通过编译

对于类模板来说,默认模板参数声明指定默认值时,需要按照从右往左的规则进行指定,而对于函数模板则不是必须的。

template <typename T1, typename T2 = int> class DefClass1;
template <typename T1 = int, typename T2> class DefClass2; //无法通过编译 template <typename T, int i = > class DefClass3;
template <int i = , typename T> class DefClass4; //无法通过编译 template <typename T1 = int, typename = T2> void DefFunc1(T1 a, T2 b);
template <int i = , typename T> void DefFunc2(T a);

6. 外部模板

编译时,对于源代码中出现的每一处模板实例化,编译器都需要去做实例化的通过;而在链接时,链接器还需要移除重复的实例化代码。解决该问题的方法是使用外部模板。c++98中已有的一个特性是显式实例化:

template <typename T> void fun(T) {}

声明:
template void fun<int>(int);

在c++11中,外部模板的声明为:

extern template void fun<int>(int);

7. 局部和匿名类型作为模板实参

template <typename T>
class X {}; template <typename T>
void TempFun(T t) {} struct A {} a;
struct { int i; } b; //匿名类型变量
typedef struct { int i; } B; //匿名类型 void Fun() {
struct C {} c; //局部类型 X<A> x1; //c++98通过,c++11通过
X<B> x2; //c++98不通过,c++11通过
X<C> x3; //c++98不通过,c++11通过
TempFun(a); //c++98通过,c++11通过
TempFun(b); //c++98不通过,c++11通过
TempFun(c); //c++98不通过,c++11通过
}

8. constexpr 近似const,可以修饰变量,也可以修饰函数

const int global = ;
int temp = ;
constexpr int a = ; //right
constexpr int b = global; //right
constexpr int c = temp; //wrong

constexpr修饰的函数,生效于编译时而不是运行时,重点应用于修饰函数使其在编译期大幅度被解释;被constexpr修饰的函数,无论是普通函数,还是类成员函数,必须是编译器可计算得到结果,即字面常量,不可是运行时才能读取的内容。

9. using取代typedef

typedef double db;
using db = double;
typedef void(*function)(int, int);
using function = void(*)(int, int);

10. emplace

作用域容器,区别于push、insert等。push_back是在容器尾部追加一个容器类型对象,emplace_back是构造一个新对象并追加在容器尾部。

std::vector<A> vec;
A a();
vec.push_back(a); std::vector<A> vec;
vec.emplace_back();

11. override/final: 显式的标识是否应该多态继承

override: 子类用override修饰其虚函数,表示要多态继承基类的虚函数,不可以修饰非虚函数。

final: 基类用final修饰其虚函数,表示其子类不可以多态继承该虚函数。

12. 类型说明符auto

auto用于从初始化表达式中推断出变量的数据类型。因此,auto定义的变量必须有初始值。

13. 类型说明符decltype

decltype的作用是选择并返回操作数的数据类型。编译器会分析表达式并得到它的类型,但是不会去计算表达式的值。如果decltype使用的是一个不加括号的变量,得到的就是该变量的类型。如果给变量加上了一层括号,编译器会把它当作一个表达式,得到的则是引用类型。

int i = ;
decltype(i) a; // a的类型是int
decltype((i)) b = i; //b的类型是int&,必须为其初始化,否则编译错误

c++11 中的注意事项的更多相关文章

  1. php课程 10-34 目录遍历中的注意事项是什么

    php课程 10-34 目录遍历中的注意事项是什么 一.总结 一句话总结:用scandir,会把目录和文件放到一个数组中. 1.移动文件怎么实现,php里面没有移动文件这个函数? 先复制,再删除 2 ...

  2. 浅谈C++11中的多线程(三)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  3. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  4. C++ 11 中的右值引用

    C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include &l ...

  5. IOS中的Block与C++11中的lambda

    ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...

  6. 在Windows 8.1及IE 11中如何使用HttpWatch

    提示:HttpWatch现已更新至v9.1.8,HttpWatch v9.1及以上的版本现都已支持Windows 7,8,8.1和IE 11. 如果你的HttpWatch专业版授权秘钥允许进入vers ...

  7. C++11中对类(class)新增的特性

    C++11中对类(class)新增的特性 default/delete 控制默认函数 在我们没有显式定义类的复制构造函数和赋值操作符的情况下,编译器会为我们生成默认的这两个函数: 默认的赋值函数以内存 ...

  8. callable object与新增的function相关 C++11中万能的可调用类型声明std::function<...>

    在c++11中,一个callable object(可调用对象)可以是函数指针.lambda表达式.重载()的某类对象.bind包裹的某对象等等,有时需要统一管理一些这几类对象,新增的function ...

  9. [转载] C++11中的右值引用

    C++11中的右值引用 May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导 ...

随机推荐

  1. 百度小程序-map组件定位

    给客户开发一个百度小程序,有个地图定位显示.百度小程序内置的api地图是不准的,通过百度一下,查询到坐标偏移算法公式,自己项目中使用,手机测试坐标已经正常显示! 经纬度,通过百度坐标拾取器拾取到! . ...

  2. [原创] Delphi 修改新建窗体时候的默认字体格式

    Delphi 修改新建窗体时候的默认字体格式 操作步骤: 1.运行输入“regedit” 2.找到目录(这里默认以Delphi 7为例) HKEY_CURRENT_USER\Software\Borl ...

  3. CGContextRef 使用小记

    . 用CGContextRef 画文字 在 UIView的 - (void)drawRect:(CGRect)rect {} 方法中进行 CGContextRef context = UIGraphi ...

  4. oracle中日期转换

    oracle中,日期转换函数有很多,常用命令如下: to_char()命令将时间戳转换为用户规定的日期格式,如: SELECT TO_CHAR(sysdate,'YYYY-MM-DD hh24:mi: ...

  5. 组合的输出(回溯、dfs)

    问题 O: [回溯法]组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r ...

  6. JS中的立即执行函数

    JS 立即执行函数可以让函数在创建后立即执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行. 1.立即执行函数的写法 立即执行函数通常有下面两种写法: //第一种写法 (func ...

  7. Spring-Boot"原生态"的logback

    前言 Logback是由 log4j创始人设计的又一个开源日志组件: logback当前分成三个模块: logback-core logbackclassic logback-access logba ...

  8. 尽量用类型化的常量替代预处理器的 #DEFINE 方法

    类型化常量 (TYPED CONSTANTS) #define ANIMATION_DURATION 0.3 这是一个预处理器指令,当编译器在代码中发现有 ANIMATION_DURATION 时,就 ...

  9. mount -o

    我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...

  10. Unzip 解压报错

      $ jar xvf pcre-8.10.zip   如果出现 jar:Command not found 要用yum下载 $ yum -y install java-1.6.0-openjdk-d ...