C++特殊類設計

1.設計不能被拷貝的類

解析:拷貝只會放生在兩個場景中

  1. 拷貝構造函數
  2. 賦值運算符重載

因此想要讓一個類禁止拷貝, 就需讓該類不能調用“拷貝構造函數”以及“賦值運算符重載”,而C++11提供的delete重載關鍵字可以讓這件事情變得更加簡單。

1.1.C++98做法

class CopyBan
{
public:CopyBan(): _c(1) {}private://拷貝構造私有化CopyBan(const CopyBan&);//賦值重載私有化CopyBan& operator=(const CopyBan&);private:int _c;
};int main()
{CopyBan c;//CopyBan copy(c);//禁用了return 0;
}

1.2.C++11做法

class CopyBan
{
public:CopyBan(): _c(1) {}//拷貝構造私有化CopyBan(const CopyBan&) = delete;//賦值重載私有化CopyBan& operator=(const CopyBan&) = delete;private:int _c;
};int main()
{CopyBan c;//CopyBan copy(c);//禁用了return 0;
}

2.設計在堆上創建的類

2.1.析構私有

解析:一個在棧上的對象如果沒有辦法調用析構,就沒有辦法被創建,因為編譯器認為沒有析構,禁止直接創建對象,這種情況就只能使用new創建對象,并且提供一個用于釋放的接口。

class HeapOnly
{
public:static void Destroy_1(HeapOnly* ptr){delete ptr;}//orvoid Destroy_2(){delete this;}private:~HeapOnly() {}
};int main()
{//HeapOnly h1;//禁用HeapOnly* ph1 = new HeapOnly;HeapOnly::Destroy_1(ph1);HeapOnly* ph2 = new HeapOnly;ph2->Destroy_2();//HeapOnly h2(*ph1);//禁用return 0;
}

2.2.構造私有

解析:如果一個類的構造被私有了,那么就無法直接調用,包括new也無法調用,然后我們提供給用戶一個接口,在類的內部new返回類指針給用戶,交給用戶釋放即可。

就是需要注意,還需要將拷貝構造私有化,避免用戶使用接口后,解引用進行拷貝。

class HeapOnly
{
public:static HeapOnly* CreateObject()//這里必須是 static 靜態成員函數{return new HeapOnly;}private:HeapOnly() {}HeapOnly(const HeapOnly&);
};int main()
{//HeapOnly h1;//禁用HeapOnly* ph = HeapOnly::CreateObject();//如果不是靜態就需要創建對象來調用 CreateObject(),但我們已經沒有辦法產生對象了//HeapOnly h2(*ph);//禁用return 0;
}

3.設計在棧上創建的類

解析:需要刪除operator new()才能徹底解決問題,注意不能私有構造函數!

class StackOnly
{
public:static StackOnly CreateObj(){return StackOnly();}//禁掉 operator new() 可以把用 new 調用拷貝構造申請對象給禁掉void* operator new(size_t size) = delete;void operator delete(void* p) = delete;private:StackOnly()//實際上刪除了 operator new() 就無需將構造函數私有化了,上述的 CreateObj() 也可以一起不要了: _a(0){}//不可私有拷貝構造//StackOnly(StackOnly& s)//	: _a(0)//{}private:int _a;
};int main()
{StackOnly obj = StackOnly::CreateObj();//StackOnly* ptr1 = new StackOnly();//禁用//StackOnly* ptr2 = new StackOnly(obj);//禁用,這個不能私有拷貝構造,只能刪除 new 的底層調用 operator new,否則就無法返回 CreateObj() 的結果//delete& obj;//禁用return 0;
}

4.設計無法被繼承的類

4.1.C++98做法

父類的構造函數被私有化就不會被子類繼承。

4.2.C++11做法

使用關鍵字final,表示該類不可被繼承。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209890.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209890.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stl庫之list鏈表與例題

stl中的list是雙向鏈表&#xff0c;優點在于插入/刪除元素方便&#xff0c;缺點是隨機訪問元素時間長 所需頭文件&#xff1a;#include <list> 初始化 list<類型名> 變量名 定義一個int類型的變量a list<int> a; 在末尾插入元素 a.push_back(i); 在開…

LeetCode 每日一題 Day 8 || 簡單枚舉

2048. 下一個更大的數值平衡數 如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數 。 示例 1&#xff1a; 輸入&#xff1a;n …

Error: Cannot find module ‘@npmcli/config‘ 最新解決辦法

看了網上許多這個問題的小伙伴&#xff0c;都是降級node版本來解決的。但是降級并不是我想要的結果。 真正的解決辦法就是更新nvm&#xff0c;將你的nvm升級到最新版本&#xff0c;然后卸載掉npm報錯的node版本&#xff0c;重新安裝即可使用。 解決辦法&#xff1a;更新nvm nv…

2020年第九屆數學建模國際賽小美賽B題血氧飽和度的變異性解題全過程文檔及程序

2020年第九屆數學建模國際賽小美賽 B題 血氧飽和度的變異性 原題再現&#xff1a; 脈搏血氧飽和度是監測患者血氧飽和度的常規方法。在連續監測期間&#xff0c;我們希望能夠使用模型描述血氧飽和度的模式。 ??我們有36名受試者的數據&#xff0c;每個受試者以1 Hz的頻率連…

【開源視頻聯動物聯網平臺】J2mod庫寫一個Modbus RTU 服務器

J2Mod是一個Java編寫的Modbus通信庫&#xff0c;可以用于實現Modbus RTU服務器。以下是一個簡單的示例&#xff0c;演示如何使用J2Mod庫創建一個Modbus RTU服務器&#xff1a; 添加J2Mod庫依賴項&#xff1a; 首先&#xff0c;確保在項目中包含J2Mod庫。你可以將J2Mod庫添加到…

CSPNet: A New Backbone that can Enhance Learning Capability of CNN(2019)

文章目錄 -Abstract1 Introduction2 Related workformer work 3 Method3.1 Cross Stage Partial Network3.2 Exact Fusion Model 4 Experiments5 Conclusion 原文鏈接 源代碼 - 梯度信息重用&#xff08;有別于冗余的梯度信息&#xff09;可以減少計算量和內存占用提高效率&am…

C語言 文件操作

文章目錄 前言文件概念文件名數據文件&程序文件文本文件&二進制文件文件緩沖區 文件操作FILE結構體文件指針文件打開&關閉文件輸入/輸出文件指針控制 前言 主要需要看的是概念部分、以及FILE結構體、文件指針部分。其余函數使用&#xff0c;知道其功能存在即可&am…

【SpringBoot】請求參數

1. BS 架構 BS架構&#xff1a;Browser/Server&#xff0c;瀏覽器/服務器架構模式。客戶端只需要瀏覽器&#xff0c;應用程序的邏輯和數據都存儲在服務端。 在SpringBoot進行web程序開發時&#xff0c;它內置了一個核心的Servlet程序 DispatcherServlet&#xff0c;稱之為 核…

EasyExcel之文件導出最佳實踐

文件導出 官方文檔&#xff1a;寫Excel | Easy Excel (alibaba.com) 引言 當使用 EasyExcel 進行 Excel 文件導出時&#xff0c;我最近在工作中遇到了一個需求。因此&#xff0c;我決定寫這篇文章來分享我的經驗和解決方案。如果你對這個話題感興趣&#xff0c;那么我希望這篇…

c語言插入排序算法(詳解)

插入排序是一種簡單直觀的排序算法&#xff0c;其主要思想是將一個待排序的元素插入到已經排好序的部分的合適位置。 插入排序的原理如下&#xff1a; 將序列分為兩部分&#xff1a;已排序部分和未排序部分。初始時&#xff0c;已排序部分只包含第一個元素&#xff0c;未排序…

php 接入 百度編輯器

按照github上的操作下載百度編輯器的包后&#xff0c;根據文檔上的步驟操作&#xff08;可能會遇到報錯&#xff09;&#xff1a; 1、git clone 倉庫 2、npm install 安裝依賴&#xff08;如果沒有安裝 grunt , 請先在全局安裝 grunt&#xff09; 我的是報了下面的錯&#…

Leetcode 17 電話號碼的字母組合

理解題意&#xff1a; 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合 本質上&#xff1a;數字代表著一個字母集合 數字的個數決定了遞歸的深度&#xff0c;即樹的深度 數字代表的字母組合決定了當前樹的寬度。 1.暴力回溯 這里沒有什么剪枝…

387.字符串中的第一個唯一字符 —> `size()`

解答&#xff1a; int firstUniqChar(string s) {int size s.size();// char count[26] { 0 };// error.1int count[26] { 0 };// for (int i 0; i < s.size() - 1; i) // error.2for (int i 0; i < size; i){count[s[i] - a] 1;}for (int i 0; i < size; i){…

Android 幸運轉盤實現邏輯

一、前言 幸運轉盤在很多app中都有&#xff0c;也有很多現實的例子&#xff0c;不過這個難度并不是如何讓轉盤轉起來&#xff0c;真正的難度是如何統一個方向轉動&#xff0c;且轉到指定的目標區域&#xff08;中獎概率從來不是隨機的&#xff09;&#xff0c;當然還不能太假&…

AI全棧大模型工程師(二十二)什么是模型訓練

文章目錄 ?? 這節課會帶給你還是寫在前面Fine-Tuning 有什么用:先看一個例子我有很多問題一、什么是:二、什么是模型2.1、通俗(不嚴謹)的說、模型是一個函數:2.2、一個最簡單的神經網絡三、什么是模型訓練3.1、模型訓練本質上是一個求解最優化問題的過程3.2、怎么求解3.…

人類的耳朵:聽覺的動態范圍

作者&#xff1a;聽覺健康 聽覺的動態范圍即可用的聽力范圍。在坐標系中&#xff0c;它可以表示為以聽閾和最大舒適級為界形成的區域&#xff0c;其坐標軸分別為頻率和聲壓級&#xff08;刺激持續時間在某種程度上對其產生影響&#xff09;。是什么因素決定了人類聽力的極限&am…

隨機森林回歸模型,SHAP庫可視化

隨機森林回歸模型 創建一個隨機森林回歸模型&#xff0c;訓練模型&#xff0c;然后使用SHAP庫解釋模型的預測結果&#xff0c;并將結果可視化。 具體步驟如下&#xff1a; 首先&#xff0c;代碼導入了所需的庫&#xff0c;包括matplotlib、shap、numpy和sklearn.ensemble。ma…

Compilation failureFailure executing javac, but could not parse the error

記一次maven編譯錯誤導致的打包失敗問題。錯誤如下 Compilation failure Failure executing javac, but could not parse the error: javac: Ч ? : ? ? : javac <options> <source files> -help г ? ? 排查路徑如下&#xff1a; 1&#xff…

[原創] FPGA的JTAG燒錄不穩定或燒錄失敗原因分析

一、電路故障背景 打板回來常會出現燒錄不良&#xff0c;調試是一個技術活&#xff0c;如果燒錄不過關&#xff0c;一切白搭。 二、常見JTAG故障原因如下&#xff1a; 1、ESD防護器件焊接不良&#xff1b; 電路板給生產部分焊接&#xff0c;發現元器件虛焊&#xff0c;特別是…

【MySQL】MySQL的varchar字段最大長度是65535?

在MySQL建表sql里,我們經常會有定義字符串類型的需求。 CREATE TABLE `user` ( `name` varchar(100) NOT NULL DEFAULT COMMENT 名字) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ; 比方說user表里的名字,就是個字符串。MySQL里有兩個類型比較適合這個場景。 char和varchar。…