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