博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++11 中的注意事项
阅读量:4362 次
发布时间:2019-06-07

本文共 2690 字,大约阅读时间需要 8 分钟。

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

2. 初始化成员变量:

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

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

struct init{ int a = 1; 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 
class People { friend T;};People

PP; //类型P在这里是People类型的友元People

Pi; //对于int类型模板参数,友元声明被忽略

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

class Object { virtual void fun() = 0;};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() = 0; virtual void Dijkstra() = 0; virtual void VNeumann(int g) = 0; 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 = 3) {}  //c++98通过编译,c++11通过编译template 
class DefClass {}; //c++98通过编译,c++11通过编译template
void DefTempParm() {}; //c++98编译失败,c++11通过编译

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

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

6. 外部模板

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

template 
void fun(T) {}声明:template void fun
(int);

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

extern template void fun
(int);

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

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

 

转载于:https://www.cnblogs.com/sssblog/p/10180809.html

你可能感兴趣的文章
Jdk与Tomcat配置与安装
查看>>
关于一个Java web与JFrame的深度结合
查看>>
VB连数据库conn.open的参数
查看>>
《信息安全系统设计基础》实验三
查看>>
SpringBoot Docs
查看>>
解决sublime text 2总是在新窗口中打开文件(标签中打开)
查看>>
VUE AntDesign DatePicker设置默认显示当前日期
查看>>
WIN32窗口模板
查看>>
859. Buddy Strings - LeetCode
查看>>
[置顶] 关键字弹出动画
查看>>
支付宝api指南
查看>>
二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式
查看>>
docker-compose部署kafka
查看>>
IOS中NSUserDefaults的用法(轻量级本地数据存储)
查看>>
cms项目技术心得!
查看>>
Django模板系统
查看>>
位(Bit)与字节(Byte)
查看>>
关于两次指针(struct型)传参数的问题
查看>>
在Logstash的配置文件中对日志事件进行区分
查看>>
字符串之strcmp
查看>>