C++11的東西介紹的差不多了,今天介紹兩個關鍵字default和delete!
**default**?
首先我們清楚,如果自己提供了任何形式的構造函數,那么編譯器將不會產生一個默認構造函數,這是一個放之四海而皆準的原則。
但凡是都是雙面性,看看一下的代碼:
~~~
class A
{
public:
A(int a){};
};
~~~
然后我們這樣使用:
~~~
A a;
~~~
悲劇發生了,編譯器不會為我們提供默認的構造函數!
所以呢,我們要暴力一些,對編譯器做一些強制的規定。這時候default關鍵字出場了:
~~~
class A
{
public:
A(int a){}
A() = default;
};
~~~
于是再也不用擔心下面的代碼報錯了:
~~~
A a;
~~~
下面談一談delete?
**delete**?
有這樣一個類:
~~~
class A
{
public:
A(int a){};
};
~~~
下面的使用都會正確:
~~~
A a(10); // OK
A b(3.14); // OK 3.14 will be converted to 3
a = b; // OK We have a compiler generated assignment operator
~~~
然而,如果我們不想讓上面的某種調用成功呢,比如不允許double類型作為參數呢?
你當然想到了,關鍵字delete:
~~~
class A
{
public:
A(int a){};
A(double) = delete; // conversion disabled
A& operator=(const A&) = delete; // assignment operator disabled
};
~~~
這時候你使用代碼:
~~~
A a(10); // OK
A b(3.14); // Error: conversion from double to int disabled
a = b; // Error: assignment operator disabled
~~~
通過關鍵字default和delete 我們隨心所欲!!!!
- 前言
- 吐血整理C++11新特性
- C++11新特性之std::function
- c++11特性之正則表達式
- c++11特性之Lambda表達式
- c++11特性之override和final關鍵字
- c++11特性之std::thread--初識
- c++11特性之std::thread--初識二
- c++11特性之initializer_list
- c++11特性之std::thread--進階
- c++11特性之std::thread--進階二
- C++11新特性之 CALLBACKS
- C++11新特性之 std::array container
- C++11新特性之 nullptr
- C++11新特性之 rvalue Reference(右值引用)
- C++11新特性之 Move semantics(移動語義)
- C++11新特性之 default and delete specifiers
- C++11新特性之 Static assertions 和constructor delegation
- 開始使用C++11的幾個理由
- C++11新特性之 std::future and std::async