1. 程式人生 > >C++實現不可被拷貝的類

C++實現不可被拷貝的類

 在C++中,類的拷貝主要是通過拷貝建構函式和賦值函式,再者就是為拷貝專門實現的成員方法。由於拷貝建構函式和賦值函式在使用者為提供的情況下是由C++編譯器自動生成的,而且是public成員,因此預設的C++類都有拷貝功能。若讓一個C++類不能被拷貝,可顯式地宣告類的拷貝建構函式和賦值函式為私有函式,從而達到該類不可被拷貝的目的。下面簡單地提供一個基類,任何需要提供不可被拷貝功能的C++類只需從此類派生即可。

/*
* 通過私有化拷貝建構函式和賦值函式而達到物件不可被拷貝的目的
* 任何需提供不能被拷貝功能的類可以直接從CNonCopyable派生即可
*/
class CNonCopyable
{
private:
    CNonCopyable(const CNonCopyable&);
    const CNonCopyable& operator=(const CNonCopyable&);

protected:
    CNonCopyable() { }
    ~CNonCopyable() { }
};

設計成不可拷貝的好處是 這樣就強制只能以指標的方式使用; 就不能以拷貝類的方式來使用他啦, 因為反覆拷貝的話要不斷的建立記憶體空間,用指標的話開銷要小的多

相關推薦

C++實現不可拷貝的類

 在C++中,類的拷貝主要是通過拷貝建構函式和賦值函式,再者就是為拷貝專門實現的成員方法。由於拷貝建構函式和賦值函式在使用者為提供的情況下是由C++編譯器自動生成的,而且是public成員,因此預設的

C++之構造函數、貝類

類型 另一個 自己 初始 c++ pre ++ 釋放 turn 無參數的構造函數適合沒初始化值的初始化對象,而引用拷貝適合創建對象時用另一個對象對其初始化,如果此時用的是淺拷貝則釋放一個對象內存時系統會釋放2次從而出錯(因為它指向同一個內存),深拷貝就不存在這個問題,各自都

C#實現類只例項化一次(多個類訪問呼叫)

C#簡單寫法如下: public  class  Singleton {      private  static  Singleton _instance =  n

C#實現檢查指定埠哪個程序佔用

1. 檢查當前系統中80埠是否正在被其它程序使用; 2. 如果80埠正在被使用,就找出該程序,並強行結束。 3. 使用C#變成語言實現。 別人問我問題時,我通常會去google一下,幫他們找到一個合適的就行了,這次也不例外!但遺憾的是,沒有找到一個解決方案,於是寫下了這篇

實現彈出一個隱藏的div視窗,body頁面變成灰色並且不可編輯

當需要實現如下圖操作,點選服務評分,出現一個服務評分視窗用來填入相關表單資訊 可是這會讓我們開啟服務評分介面時還可以點選body主介面中的購物車等連結,這是不對的,因此我們可以使用層疊樣式表來指定外圍

c# 實現 ListBox 每一列可以有各自的顏色

font 效果 else graphic .com ror graphics 不能 c# 上圖是想實現的效果, 註意不是所有行一個顏色 首先把 listbox 的 DrawMode 屬性 改為 OwnerDrawFixed 然後 override listbox

設計模式——抽象工廠模式(C++實現

concrete out png return style bsp ctp img using 1 #include <iostream> 2 #include <string> 3 4 usin

設計模式——觀察者模式(C++實現

ace mes des ret rtu cto pattern virt date 1 #include <iostream> 2 #include <vector> 3 #include <algorithm>

設計模式C++實現——工廠方法模式

對象 類型 begin 創建對象 dia rate rod rtu log 模式定義: 工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。 模式結構: Creator是一個類,它

C++實現約瑟夫環的問題

content 人在 -h tel padding next family bsp sun 約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最後剩下一個,其余人都將被殺掉。比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最後剩下1

LR(1)文法分析器 //c++ 實現

返回 set 歸約 else 遍歷 close 入棧 inline 全部 1、先讀入終結符,非終結符,和全部產生式。 2、預處理:初始化;getpp()獲得每一個非終結符在產生式左邊時的產生式編號, 記錄在 string getp[]中(能夠多個)。 3.獲得全

AVLTree的實現算法(C++實現)

pen nod util ron bool allocator cti tor utili #include<stack>#include<utility>#include<allocators>#include<functiona

哈夫曼編碼解碼 C++實現

錯誤 urn using 過程 簡單 cin n) struct ren 哈夫曼編碼是一個通過哈夫曼樹進行的一種編碼,一般情況下,以字符:‘0’與‘1’表示。編碼的實現過程很簡單,只要實現哈夫曼樹,通過遍歷哈夫曼樹,這裏我們從每一個葉子結點開始向上遍歷,如果該結點為父節點的

[深入學習C#]C#實現多線程的方式:Task——任務

ren avr 利用 run 如何 創建 其中 continue rep 簡介   .NET 4包含新名稱空間System.Threading.Tasks,它 包含的類抽象出了線程功能。 在後臺使用ThreadPool。 任務表示應完成的某個單元的工作。 這個單元的工作可以

c++ 實現ping

n) time_t ply setuid details struct copyto 新版本 -o //頭文件 [cpp] view plain copy /* * File: CPing.h * Author: jaylong35 *

Linux c實現一個tcp文件服務器和客戶端

repr snippets 功能 stderr strcpy fprintf inet_addr 編寫 create 總體需求:編寫tcp文件服務器和客戶端。客戶端可以上傳和下載文件。 ===========================================

簡單測試--C#實現中文漢字轉拼音首字母

esp chart htm foreach ext ads linq 類庫 play 第一種: 這個是自己寫的比較簡單的實現方法,要做漢字轉拼音首字母,首先應該有一個存儲首字母的數組,然後將要轉拼音碼的漢字與每個首字母開頭的第一個漢字即“最小”的漢字作比較,這裏的最小指的是

設計模式——命令模式(C++實現

clear cto ive pre urn bak std oot style 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include <

字符串模式匹配KMP算法中的next數組算法及C++實現

完整 牛客網 names 數據 代碼 str 關於 clu .com 一、問題描述: 對於兩個字符串S、T,找到T在S中第一次出現的起始位置,若T未在S中出現,則返回-1。 二、輸入描述: 兩個字符串S、T。 三、輸出描述: 字符串T在S中第一次出現的起始位置,若未出現,則

設計模式——職責鏈模式(C++實現

delet hand jin void ng- nbsp request req oot   1 #include <iostream> 2 #include <string> 3 4 using namesp