类成员变量初始化
C++ 11 中引入了一种简单的成员变量初始化方法,可以像普通变量一样初始化成员变量。
class Test
{
public:
int a = 1;
int b = 2, c = 3;
};
类的特殊成员函数
包括构造函数、析构函数、拷贝构造函数、赋值操作。当我们没有具体给出这些特殊成员函数的实现时。C++ 编译器会替我们实现一个默认的版本。有时,这并不是我们需要 的。C++ 11 提供了一种机制,可以控制这些默认的函数是否生成。
class A
{
public:
// Explicitly include default constructor
A() = default;
A(int i);
// Disable copy constructor
A(const A&) = delete;
// Disable copy assignment operator
A& operator=(const A&) = delete;
};
下面来具体解释一下。
A() = default;
告诉编译器替我们生成默认构造函数 A()。
A(const A&) = delete;
A& operator=(const A&) = delete;
则禁止编译器生成这两个函数。下面的例子禁止了无参数的构造函数。
class B
{
public:
B() = delete;
B(int i): m_b(i) {};
int m_b;
};
int main()
{
B b; // 这里会报错,我们阻止了编译器替我们生成默认构造函数
B c(10); // OK
}
变量的初始化
C++ 11 中引入了一种统一的初始化语法,或者说扩展了原来只能初始化数组的 “{}”。这种语法可以初始化变量、数组、类对象。下面是个例子:
#include <string>
#include <vector>
using namespace std;
int i { 1 };
string s {"Hello"};
int a[] { 1, 2 };
int *p= new int [2] { 1, 2 };
vector<string> box { "one", "two" };
// Call parameterless constructor
MyClass b {};
// Call copy constructor
MyClass c { b };
类成员变量的初始化也可以这样写:
class Test
{
public:
int a {1};
int b {2}, c = 3;
};
delete 多个变量
这个其实不是 C++ 的新特性,应该在很早的版本中就支持了。但是我一直以为一个 delete 语句只能删除一个变量。下面是个例子。
int * a = new int;
double * b = new double;
int * c = new int[2];
double * d = new double [2] ;
delete a, b;
delete[] c, d;
派生类使用基类构造函数的新方法
C++ 11 中引入了一种新的语法:
class D2 : public B2
{
public:
using B2::B2; // inherit all constructors
int y{0};
};
override 关键字
这个关键字我以前写过一篇博客。这里就不重复了。
http://http://blog.csdn.net/liyuanbhu/article/details/43816371
final 关键字修饰虚函数
一旦一个虚函数被声明为final,派生类不能再重载它。
class Base
{
virtual void foo() final {}
}
class Derived
{
void foo() {} // error: Base::foo marked as final
}