1. 程式人生 > >C++11中delete的使用

C++11中delete的使用

出處:http://blog.csdn.net/fengbingchun/article/details/52475108

In C++11, defaulted and deleted functions give you explicit control over whether the special member functions are automatically generated.

The opposite of a defaulted function is a deleted function.

Deleted functions are useful for preventing object copying, among the rest. Recall that C++ automatically declares a copy constructor and an assignment operator for classes. To disable copying, declare these two special member functions “=delete”.

The delete specifier can also be used to make sure member functions with particular parameters aren’t called.

=default: it means that you want to use the compiler-generated version of that function, so you don't need to specify a body.

=delete: it means that you don't want the compiler to generate that function automatically.

C++11中,對於deleted函式,編譯器會對其禁用,從而避免某些非法的函式呼叫或者型別轉換,從而提高程式碼的安全性。

對於 C++ 的類,如果程式設計師沒有為其定義特殊成員函式,那麼在需要用到某個特殊成員函式的時候,編譯器會隱式的自動生成一個預設的特殊成員函式,比如預設的建構函式、解構函式、拷貝建構函式以及拷貝賦值運算子。

為了能夠讓程式設計師顯式的禁用某個函式,C++11標準引入了一個新特性:deleted函式。程式設計師只需在函式聲明後加上”=delete;”,就可將該函式禁用。

deleted函式特性還可用於禁用類的某些轉換建構函式,從而避免不期望的型別轉換。

deleted函式特性還可以用來禁用某些使用者自定義的類的new操作符,從而避免在自由儲存區建立類的物件。

必須在函式第一次宣告的時候將其宣告為deleted函式,否則編譯器會報錯。即對於類的成員函式而言,deleted函式必須在類體裡(inline)定義,而不能在類體外(out-of-line)定義。

雖然defaulted函式特性規定了只有類的特殊成員函式才能被宣告為defaulted函式,但是deleted函式特性並沒有此限制。非類的成員函式,即普通函式也可以被宣告為deleted函式。

下面是從其他文章中copy的測試程式碼,詳細內容介紹可以參考對應的reference:

  1. #include "delete.hpp"
  2. #include <iostream>
  3. //////////////////////////////////////////////////////////
  4. // reference: http://www.learncpp.com/cpp-tutorial/b-6-new-virtual-function-controls-override-final-default-and-delete/
  5. class Foo  
  6. {  
  7.     Foo& operator=(const Foo&) = delete// disallow use of assignment operator
  8.     Foo(const Foo&) = delete// disallow copy construction
  9. };  
  10. class Foo_1  
  11. {  
  12.     Foo_1(longlong); // Can create Foo() with a long long
  13.     Foo_1(long) = delete// But can't create it with anything smaller
  14. };  
  15. class Foo_2  
  16. {  
  17.     Foo_2(longlong); // Can create Foo() with a long long
  18.     template<typename T> Foo_2(T) = delete// But can't create it with anything else
  19. };  
  20. ///////////////////////////////////////////////
  21. // reference: http://www.bogotobogo.com/cplusplus/C11/C11_default_delete_specifier.php
  22. class A_  
  23. {  
  24. public:  
  25.     A_(int a){};  
  26.     A_(double) = delete;         // conversion disabled
  27.     A_& operator=(const A_&) = delete;  // assignment operator disabled
  28. };  
  29. int test_delete1()  
  30. {  
  31.     A_ a_(10);     // OK
  32.     // A_ b(3.14);   // Error: conversion from double to int disabled
  33.     // a = b;       // Error: assignment operator disabled
  34.     return 0;  
  35. }  
  36. ////////////////////////////////////////////////////
  37. // reference: https://msdn.microsoft.com/zh-cn/library/dn457344.aspx
  38. struct widget  
  39. {  
  40.     // deleted operator new prevents widget from being dynamically allocated.
  41.     void* operator new(std::size_t) = delete;  
  42. };  

GitHubhttps://github.com/fengbingchun/Messy_Test