C++中禁止編譯器自動生成構(gòu)造函數(shù)

簡介

本文主要用于介紹編譯器幫我們默默的編寫了哪些函數(shù)以及當我們不需要這些函數(shù)的時候,應該如何禁止編譯器幫我們編寫這些函數(shù)。

本文是在閱讀《c++ primer》《Effective c++》的總結(jié),所以部分內(nèi)容可能會與書中的相同

在閱讀本章之前,請先閱讀C++中編譯器默默生成的函數(shù)

C++如何禁止編譯器生成某些函數(shù)

對于某些類而言,對象的拷貝或賦值時不合法的,例如定義了一個學生類,但對于學生對象而言,只能有一個,世界上不存在兩個一樣的學生對象,我們應該明確阻止學生對象之間的拷貝或賦值,也就是說學生類不支持拷貝或賦值的。

存在很多中方法來阻止 拷貝構(gòu)造函數(shù)拷貝賦值運算符的生成,下面主要介紹三種:

  • C++11標準下,將這些函數(shù)聲明為刪除的函數(shù),在函數(shù)參數(shù)的后面加上=delete來指示出我們定義的刪除的函數(shù)
  • 將這些函數(shù)聲明為private,并且不提供函數(shù)定義
  • 將待定義的類成為一個不支持copy的類的子類

例程

#include <iostream>

// 方法一
class Test {
public:
    Test() = default; // use the default constructor
    Test(const Test&) = delete;
    Test& operator=(const Test&) = delete;
    int value = 10;
};
//方法二
class NoCopy {
public:
    NoCopy() = default;
    int value = 10;
private:
    NoCopy(const NoCopy&);
    NoCopy& operator=(const NoCopy&);
};
// 方法三
//boost/noncopyable縮減版
class noncopyable
{
protected:
    noncopyable() = default;
    ~noncopyable() = default;
    noncopyable(const noncopyable&) = delete;
    noncopyable& operator=(const noncopyable&) = delete;
};
class nocopy :noncopyable //默認繼承方式為私有繼承
{
    //...
};

int main()
{
    Test test; // default constructor
//[Error]:function "Test::Test(Test &)" cannot be referenced -- it is a deleted function
    //Test test2(test); // copy constructor
    //std::cout <<"test2.value: " <<test2.value << std::endl;
    //test2.value = 300;
//[Error]:function "Test::operator=(Test &)" cannot be referenced -- it is a deleted function   
    //test = test2; // copy assignment
    std::cout <<"test.value: " <<test.value << std::endl;
    return 0;
}
//輸出:
test.value: 10
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,685評論 1 51
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,569評論 0 13
  • 1.面向?qū)ο蟮某绦蛟O計思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進行操作的方法封裝形成一個個的對象。 2.什么是類?...
    少帥yangjie閱讀 5,125評論 0 14
  • 喝茶從來不是附庸風雅,它是極私人的事情,真正進入到喝茶的抽象空間時,是沒有人愿意講話的。喝茶就像放電影,喝著喝著便...
    向陽花z閱讀 241評論 0 1
  • 「運勢非命定,是一股生命趨勢的流動?!?牡羊座趨勢 本月份牡羊座要確定方向,行動起來,把決定權(quán)交在自己手上。謹記身...
    占心室閱讀 300評論 0 0

友情鏈接更多精彩內(nèi)容