您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-17 13:50 711 查看

类成员变量初始化

C++ 11 中引入了一种简单的成员变量初始化方法,可以像普通变量一样初始化成员变量。

[code]class Test
{
public:
    int a = 1;
    int b = 2, c = 3;
};


类的特殊成员函数

包括构造函数、析构函数、拷贝构造函数、赋值操作。当我们没有具体给出这些特殊成员函数的实现时。C++ 编译器会替我们实现一个默认的版本。有时,这并不是我们需要 的。C++ 11 提供了一种机制,可以控制这些默认的函数是否生成。

[code]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;
};


下面来具体解释一下。

[code]A() = default;


告诉编译器替我们生成默认构造函数 A()。

[code]A(const A&) = delete;
A& operator=(const A&) = delete;


则禁止编译器生成这两个函数。下面的例子禁止了无参数的构造函数。

[code]class B
{
public:
    B() = delete;
    B(int i): m_b(i) {};
    int m_b;
};
int main() 
{
    B b; // 这里会报错,我们阻止了编译器替我们生成默认构造函数
    B c(10); // OK
}


变量的初始化

C++ 11 中引入了一种统一的初始化语法,或者说扩展了原来只能初始化数组的 “{}”。这种语法可以初始化变量、数组、类对象。下面是个例子:

[code]#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 };


类成员变量的初始化也可以这样写:

[code]class Test
{
public:
    int a {1};
    int b {2}, c = 3;
};


delete 多个变量

这个其实不是 C++ 的新特性,应该在很早的版本中就支持了。但是我一直以为一个 delete 语句只能删除一个变量。下面是个例子。

[code]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 中引入了一种新的语法:

[code]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,派生类不能再重载它。

[code]class Base
{
    virtual void foo() final {}
}
class Derived
{
    void foo() {} // error: Base::foo marked as final
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: