C++ 学习笔记(一些新特性总结3)

public、protected 和 private 继承

public 继承时,基类的存取限制是不变的。

class MyClass
{
public: // Unrestricted access
int myPublic; protected: // Defining or derived class only
int myProtected; private: // Defining class only
int myPrivate;
} class MyChild1 : public MyClass
{
// myPublic is public
// myProtected is protected
// myPrivate is private
};

protected 继承时,基类的 public 成员变成 protected 成员。

class MyChild2 : protected MyClass
{
// myPublic is protected
// myProtected is protected
// myPrivate is private
};

private 继承时。基类的全部成员都变成 private 成员。这也是默认的继承方式。

class MyChild3 : private MyClass
{
// myPublic is private
// myProtected is private
// myPrivate is private
};

enum 类型的一些注意事项

同一个作用域内的 enum 名字非常easy冲突。

所以声明 enum 时要小心。

比方:

enum Color1 { Red = 3, Green = 4, Blue = 5 };
enum Color2 { Red = 30, Green = 40, Blue = 50 };

尽管是两个不同的 enum,可是 Color1 与 Color2 的 Red 、Green 和 Blue 会相互冲突。 所以应该尽量将 enum 限制在较小的范围内。

比方限制在一个 namespace 中或者限制在一个类中,当然也能够限制在一个函数中,只是这样就无法在函数外面訪问了。

class MyClass
{
enum Color { Red, Green, Blue };
};
void myFunction()
{
enum Color { Red, Green, Blue };
}

C++11 中引入了一种更安全的 enum。能够解决 enum 名字easy冲突的问题。以下是个样例。

enum class Color1 { Red = 3, Green = 4, Blue = 5 };
enum class Color2 { Red = 33, Green = 44, Blue = 55 }; int main()
{
Color2 c = Color2::Red;
cout << (int)c << endl;
}

可是这样的 enum 有点严格的过头了。连 enum 到 int 的默认类型转换都禁止了。以下的代码就会报错。

Color2 c = Color2::Red;
cout << c << endl; // error
if(c == 3) // error

这样的 enum 另一个特点。就是我们能够决定这个类型详细用什么类型的整型变量来实现。比方以下的样例:

enum class Color1 : long { Red = 3, Green = 4, Blue = 5 };
enum class Color2 : char { Red = 33, Green = 44, Blue = 55 }; int main()
{
cout << sizeof(Color1) << endl;
cout << sizeof(Color2) << endl;
}

constexpr keyword

C++14 中进一步扩展了常量这个概念。一个表达式假设能够在编译时就确定它的值,那么它就能作为一个常量来使用。比方以下这个样例用一个函数的返回值来作为一个数组的长度。

constexpr int getDefaultSize(int multiplier)
{
return 3 * multiplier;
} // Compile-time evaluation
int myArray[getDefaultSize(10)];

[[deprecated]]

C++14 中引入了 [[deprecated]] 这个属性,能够用来修饰一个函数或对象。比方:

// Mark as deprecated
[[deprecated]] void foo() {}

编译代码时, foo() 这个函数被调用编译器会给出警告。

noexcept keyword

用来指示一个函数不会抛出不论什么异常。

有助于编译器去优化代码。

void foo() noexcept {} // may not throw exceptions

变量模板

在 C++14 之前, 仅仅有函数模板和类模板。C++14 又引入了一种新的模板类型,称为变量模板。以下是个样例:

template<class T>
constexpr T pi = T(3.1415926535897932384626433L);

这样 pi 就成了一个变量模板,用它能够给其它变量初始化。

int i = pi<int>; // 3
float f = pi<float>; // 3.14...

C++ 学习笔记(一些新特性总结3)的更多相关文章

  1. 前端学习笔记 --ES6新特性

    前言 这篇博客是我在b站进行学习es6课程时的笔记总结与补充. 此处贴出up主的教程视频地址:深入解读ES6系列(全18讲) 1.ES6学习之路 1.1 ES6新特性 1. 变量 2. 函数 3. 数 ...

  2. WEB学习笔记14-HTML5新特性的使用

    (1)定义文档类型声明 <!DOCTYPE html> (2)定义页面编码 <!—HTML 4.01中定义的设置页面编码的方式--> <meta http-equiv=& ...

  3. JavaSE 学习笔记之新特性之泛型(二十)

    泛型:jdk1.5版本以后出现的一个安全机制.表现格式:< > 好处: 1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题. ...

  4. 可能是最早的学习Android N新特性的文章

    可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...

  5. 从零开始一起学习SLAM | C++新特性要不要学?

    LAM,C++编程是必备技能.不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套. 本文所谓的C++新特性是指C++11及其以后的C++14.C++17增加的新关键字和新语法特性.其 ...

  6. Java学习之==>Java8 新特性详解

    一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...

  7. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  8. ios学习路线—Objective-C(新特性)

    1.方法顺序无关 Objective-C类由声明文件h和实现文件m组成,所有的public方法都在h文件中声明,private方法可以写在m文件中,但是在早期的编译环境中需要注意方法的顺序,例如下面的 ...

  9. CSS3新特性(阴影、动画、渐变、变形、伪元素等) CSS3与页面布局学习总结——CSS3新特性(阴影、动画、渐变、变形、伪元素等)

      目录 一.阴影 1.1.文字阴影 1.2.盒子阴影 二.背景 2.1.背景图像尺寸 2.2.背景图像显示的原点 三.伪元素 3.1.before 3.2.after 3.3.清除浮动 四.圆角与边 ...

  10. AMQ学习笔记 - 12. Spring-JmsTemplate特性设置

    概述 这是关于JmsTemplate的最后一篇总结,且只会介绍几个比较重要的特性. 消息的递送模式 在发送消息给时,可以告知这是持久化的消息,还是非持久化的消息.如果是非持久化的消息,broker会将 ...

随机推荐

  1. 小学生绞尽脑汁也学不会的python(面对对象-----成员)

    小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...

  2. js实现鼠标吸附线条效果

    如图,箭头→为鼠标位置,鼠标会带有吸附着一些线条的效果,具体效果可在我的博客查看,当然,这也是可很受欢迎很常见的效果了=3= <script> !function(){ function ...

  3. HDU 3073 Saving Beans

    Saving Beans Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  4. 在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络

    在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络 学习了:https://linux.cn/article-5410-1.html#3_3613 http://www.linu ...

  5. Android与server通信的方法之中的一个(json)效率不高安全性不好

    http通信.以xml或者json为载体.相互通信数据. Android对于http的网络通信,提供了标准的java接口--httpURLConnection接口.以及apache的接口--httpc ...

  6. 上传文件 nginx 413错误

    nginx : 413 Request Entity Too Large 上传文件过程发生413 Request Entity Too Large错误,翻译为请求实体过大,断定为nginx限制了请求体 ...

  7. iOS声明变量详解

    内容概述: 本文主要讲述了ios中多种声明变量方式的区别与联系,以及@interface声明的成员变量与@property属性的差异.最后介绍了推荐的声明方式. atany原创,转载请注明博主与博文链 ...

  8. SpringMVC+Spring+Hibernate框架整合原理,作用及使用方法

    转自:https://blog.csdn.net/bieleyang/article/details/77862042 SSM框架是spring MVC ,spring和mybatis框架的整合,是标 ...

  9. luogu 2679 子串

    子串 史上最简短的一篇博客,毕竟看题解ac心疼我的kmp /* f[i][j][k][0/1]表示A的前i个,B的前j个,用到了k个子串,当前字符选或者不选. 所以f[0][0][0][0]的方案数为 ...

  10. label标签的可访问性问题

    label标签可以优雅地扩大表单控件元素的点击区域.例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高页面的可用性可访问性是很有帮助的. 其实,它的样子 ...