C++ 学习笔记(一些新特性总结3)
2016-01-19 18:51
453 查看
C++ 学习笔记(一些新特性总结3)
public、protected 和 private 继承
public 继承时,基类的存取限制是不变的。[code]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 成员。
[code]class MyChild2 : protected MyClass { // myPublic is protected // myProtected is protected // myPrivate is private };
private 继承时,基类的所有成员都变成 private 成员,这也是默认的继承方式。
[code]class MyChild3 : private MyClass { // myPublic is private // myProtected is private // myPrivate is private };
enum 类型的一些注意事项
同一个作用域内的 enum 名字很容易冲突。所以声明 enum 时要小心。比如:[code]enum Color1 { Red = 3, Green = 4, Blue = 5 }; enum Color2 { Red = 30, Green = 40, Blue = 50 };
虽然是两个不同的 enum,但是 Color1 与 Color2 的 Red 、Green 和 Blue 会相互冲突。 所以应该尽量将 enum 限制在较小的范围内。比如限制在一个 namespace 中或者限制在一个类中,当然也可以限制在一个函数中,不过这样就无法在函数外面访问了。
[code]class MyClass { enum Color { Red, Green, Blue }; }; void myFunction() { enum Color { Red, Green, Blue }; }
C++11 中引入了一种更安全的 enum,可以解决 enum 名字容易冲突的问题。下面是个例子。
[code]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 的默认类型转换都禁止了。下面的代码就会报错。
[code]Color2 c = Color2::Red; cout << c << endl; // error if(c == 3) // error
这种 enum 还有一个特点,就是我们可以决定这个类型具体用什么类型的整型变量来实现。比如下面的例子:
[code]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 关键字
C++14 中进一步扩展了常量这个概念。一个表达式如果可以在编译时就确定它的值,那么它就能作为一个常量来使用。比如下面这个例子用一个函数的返回值来作为一个数组的长度。[code]constexpr int getDefaultSize(int multiplier) { return 3 * multiplier; } // Compile-time evaluation int myArray[getDefaultSize(10)];
[[deprecated]]
C++14 中引入了 [[deprecated]] 这个属性,可以用来修饰一个函数或对象。比如:[code]// Mark as deprecated [[deprecated]] void foo() {}
编译代码时, foo() 这个函数被调用编译器会给出警告。
noexcept 关键字
用来指示一个函数不会抛出任何异常。有助于编译器去优化代码。[code]void foo() noexcept {} // may not throw exceptions
变量模板
在 C++14 之前, 只有函数模板和类模板。C++14 又引入了一种新的模板类型,称为变量模板。下面是个例子:[code]template<class T> constexpr T pi = T(3.1415926535897932384626433L);
这样 pi 就成了一个变量模板,用它可以给其他变量初始化。
[code]int i = pi<int>; // 3 float f = pi<float>; // 3.14...
相关文章推荐
- C/C++函数指针声明
- C++学习之继承篇一(继承权限)
- 编译器对齐机制——由一道求C++类大小的题说开
- 解析C++中四种强制类型转换的区别详解
- C++相关的复习
- C++: std::string 与 Unicode 如何结合?
- 学习历程《C语言陷阱和缺陷》
- Rcpp简明入门
- 详解C++编程中一元运算符的重载
- C++设计模式——享元模式
- C++中#define、typedef和const的区别
- 详解在C++中显式默认设置的函数和已删除的函数的方法
- 类的组合和继承
- C++经典面试题
- Java内存模型FAQ(二) 其他语言,像C++,也有内存模型吗?
- 改善程序与设计的55个具体做法之一:视C++为语言联邦
- operator new在C++中的各种写法
- 1008. Elevator (20)
- C语言中extern的用法
- 微机接口课设 汽车控制系统 C语言源代码 Proteus 8086