c++11 default和delete

转自:https://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html

在函数声明后加 =default 和 =delete。通过将类的特殊成员函数声明为 defaulted 函数,可以显式指定编译器为该函数自动生成默认函数体。通过将函数声明为 deleted 函数,可以禁用某些不期望的转换或者操作符。Defaulted 和 deleted 函数特性语法简单,功能实用,是对 C++ 标准的一个非常有价值的扩充。

 

C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符

default:

1、

class X{ 
public: 
 X(int i){ 
   a = i; 
 }     
private: 
 int a; 
}; 
 
X x;  // 错误 , 默认构造函数 X::X() 不存在

1编译出错的原因在于类 X 已经有了用户自定义的构造函数,所以编译器将不再会为它隐式的生成默认构造函数。如果需要用到默认构造函数来创建类的对象时,程序员必须自己显式的定义默认构造函数

2、

class X{ 
public: 
 X(){};  // 手动定义默认构造函数
 X(int i){ 
   a = i; 
 }     
private: 
 int a; 
}; 
 
X x;   // 正确,默认构造函数 X::X() 存在

2 可以看出,原本期望编译器自动生成的默认构造函数需要程序员手动编写了,即程序员的工作量加大了。此外,手动编写的默认构造函数的代码执行效率比编译器自动生成的默认构造函数低。类的其它几类特殊成员函数也和默认构造函数一样,当存在用户自定义的特殊成员函数时,编译器将不会隐式的自动生成默认特殊成员函数,而需要程序员手动编写,加大了程序员的工作量。类似的,手动编写的特殊成员函数的代码执行效率比编译器自动生成的特殊成员函数低。

Defaulted 函数的提出

为了解决如清单 3 所示的两个问题:1. 减轻程序员的编程工作量;2. 获得编译器自动生成的默认特殊成员函数的高的代码执行效率,C++11 标准引入了一个新特性:defaulted 函数。程序员只需在函数声明后加上“=default;”,就可将该函数声明为 defaulted 函数,编译器将为显式声明的 defaulted 函数自动生成函数体。例如:

3、

class X{ 
public: 
 X()= default; 
 X(int i){ 
   a = i; 
 }     
private: 
 int a; 
}; 
 
X x;

3 中,编译器会自动生成默认构造函数 X::X(){},该函数可以比用户自己定义的默认构造函数获得更高的代码效率。 

delete:

4、

class X{            
     public: 
       X(); 
       X(const X&) = delete;  // 声明拷贝构造函数为 deleted 函数
       X& operator = (const X &) = delete; // 声明拷贝赋值操作符为 deleted 函数
     }; 
 
 int main(){ 
  X x1; 
  X x2=x1;   // 错误,拷贝构造函数被禁用
  X x3; 
  x3=x1;     // 错误,拷贝赋值操作符被禁用
 }

 

Defaulted 函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。例如

class X { 
public: 
 int f() = default;      // 错误 , 函数 f() 非类 X 的特殊成员函数
 X(int) = default;       // 错误 , 构造函数 X(int, int) 非 X 的特殊成员函数
 X(int = 1) = default;   // 错误 , 默认构造函数 X(int=1) 含有默认参数
};

Defaulted 函数既可以在类体里(inline)定义,也可以在类体外(out-of-line)定义。例如:

class X{ 
public:  
  X() = default; //Inline defaulted 默认构造函数
  X(const X&); 
  X& operator = (const X&); 
  ~X() = default;  //Inline defaulted 析构函数
}; 
 
X::X(const X&) = default;  //Out-of-line defaulted 拷贝构造函数
X& X::operator = (const X&) = default;     //Out-of-line defaulted  
    // 拷贝赋值操作符

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,`default`和`delete`关键字具有以下作用: 1. `default`关键字:用于指示编译器生成默认的特殊成员函数的实现。当类声明了特殊成员函数(如默认构造函数、拷贝构造函数、拷贝赋值运算符、析构函数)但没有提供具体的实现时,可以使用`default`关键字告诉编译器生成默认的实现。默认构造函数创建对象时不执行任何操作,拷贝构造函数用于对象的拷贝初始化,拷贝赋值运算符用于对象的赋值操作,析构函数用于对象的销毁。 示例: ```cpp class MyClass { public: // 使用default关键字声明默认构造函数 MyClass() = default; // 使用default关键字声明拷贝构造函数 MyClass(const MyClass& other) = default; // 使用default关键字声明拷贝赋值运算符 MyClass& operator=(const MyClass& other) = default; // 使用default关键字声明析构函数 ~MyClass() = default; }; ``` 2. `delete`关键字:用于禁止编译器生成特殊成员函数或某个特定的重载函数。通过使用`delete`关键字,可以显式删除某个特殊成员函数的默认实现,使其在编译时变为不可用。也可以通过删除某个特定的重载函数,阻止其在特定情况下的使用。 示例: ```cpp class MyClass { public: // 使用delete关键字删除默认构造函数,禁止通过无参构造函数创建对象 MyClass() = delete; // 使用delete关键字删除拷贝赋值运算符,禁止对象的赋值操作 MyClass& operator=(const MyClass& other) = delete; // 删除某个特定的重载函数 void func(int) { ... } void func(double) = delete; // 禁止使用double类型参数的func函数 }; ``` 需要注意的是,`default`和`delete`关键字只能用于特殊成员函数,而不能用于普通成员函数或其他类型的函数。此外,`delete`关键字还可以用于删除特定的重载函数,通过对函数的参数列表进行删除,使得该函数在特定情况下不可用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值