1. 程式人生 > >條款5:類拷貝賦值操作符不能作用於-》常量成員變數和引用成員變數

條款5:類拷貝賦值操作符不能作用於-》常量成員變數和引用成員變數

1.知識點:

什麼時候一個空類,不再是空類了呢?當c++編譯器處理之後。

如果沒有定義,編譯器會為你產生四個函式:

1)  預設建構函式

2)  Copy建構函式

3)  賦值建構函式

4)  解構函式

注意這些函式都是public且是inline的。

這裡還有一點要說明的:不是說編譯器一定會為你產生這些函式,而是說,當這些函式被呼叫時,它們才會被編譯器創建出來。

  • 舉一個例子:
template<class T>

class NamedObject{
         public:
                   NamedObject(std::string& name, const T& value);
                   ...
         private:
                   std::string& nameValue;
                   const T objectValue;
}

現在考慮下面會發生什麼事情:

std::string newDog("persephone");

std::string oldDog("satch");

NamedObject<int> p(newDog, 2);

NamedObject<int> s(oldDog, 36);

p = s;

如果說p.nameValue賦值後,會指向s.nameValue,則你就錯了。為什麼?

因為nameValue這個東西是一個指向string物件的引用。C++明文規定:不允許改變引用。

另一個問題:objectValue會怎麼樣呢,p.objectValue 會等於36嗎?不會,為什麼?

因為在類中,objectValue是const成員。不允許為const成員改變值。

那麼我們怎麼做賦值建構函式呢?我們要自己定義,這時,如果我們沒有定義賦值建構函式,C++會拒絕此物件的一切賦值。

另一個例子,如果在base類中,我們把賦值建構函式定義為私有成員。派生類的賦值會怎麼樣呢?

這時,如果我們沒有定義賦值建構函式,則C++會拒絕這些賦值操作。因為在賦值時,會讓基類成員呼叫基類自己的賦值建構函式,但是這時是私有的,所以就會出問題。


相關推薦

條款5拷貝操作符不能作用-》常量成員變數引用成員變數

1.知識點: 什麼時候一個空類,不再是空類了呢?當c++編譯器處理之後。 如果沒有定義,編譯器會為你產生四個函式: 1)  預設建構函式 2)  Copy建構函式 3)  賦值建構函式 4)  解構函

C++本質運算符=的重載,以及深拷貝拷貝

fin 過程 種類 解決 對象的引用 執行 面向 鏈式 alt 關鍵詞:構造函數,淺拷貝,深拷貝,堆棧(stack),堆heap,賦值運算符摘要: 在面向對象程序設計中,對象間的相互拷貝和賦值是經常進行的操作。 如果對象在申明的同時馬上進行的初始化操作,則

【C++ Primer 第15章】定義派生拷貝運算符

運算符 結果 類成員變量 you 輸出 ons c++ prime get pre 學習資料 • 派生類的賦值運算符/賦值構造函數也必須處理它的基類成員的賦值 定義賦值運算符 【註意】對派生類進行拷貝構造時,如果想讓基類的成員也同時拷貝,就一定要在派生類拷貝

型別變數引用型別變數的區別

主要區別在於 系統在記憶體空間中為兩者分配儲存空間的方式不同。 1、記憶體空間 記憶體空間分為棧空間和堆空間。值型別資料的儲存空間在棧空間中分配,引用型別資料則在堆空間分配。 由系統管理棧空間的所有操作,包括進棧和出棧。當一個數據出棧後,其所分配到的儲存空間由系統自動回收。

c++拷貝控制 - 拷貝建構函式 & 拷貝運算子

一、拷貝控制 當定義一個類時,我們可以顯式或隱式地指定此型別的物件拷貝、移動、賦值和銷燬時做什麼。 一個類可以通過定義五種特殊的成員函式來控制這些操作,包括:++拷貝建構函式++、++拷貝賦值函式++、++移動建構函式++、++移動複製函式++和++解構函式++。我們稱這些操作為

批註C++中複製建構函式與過載操作符總結:預設淺拷貝,帶指標的需要深拷貝

前言 這篇文章將對C++中複製建構函式和過載賦值操作符進行總結,包括以下內容: 複製建構函式和過載賦值操作符的定義;複製建構函式和過載賦值操作符的呼叫時機;複製建構函式和過載賦值操作符的實現要點;複製建構函式的一些細節。 複製建構函式和過載賦值操作符的定義 我們都知道

C++常見筆試面試題目string拷貝運算子函式

要求:寫出一個String類的賦值運算子函式 注意事項: (1)返回值的型別需宣告為該型別的引用,並在函式結束前返回例項自身的引用(即*this),因為只有返回一個引用,才可以允許連續賦值。 (2)傳入引數必須為常量的引用。常量確保在函式內不改變傳入例項的

c++拷貝與銷毀(拷貝構造函數、拷貝運算符析構函數)

錯誤 保存 編譯 oid 生成 標準庫 int 為什麽 explicit 拷貝構造函數 如果一個構造函數的第一個參數是自身類類型的引用,且任何額外參數都有默認值,則此構造函數是拷貝構造函數。 拷貝構造函數第一個參數必須是一個引用類型。此參數幾乎總是一個con

python學習(六)python中、淺拷貝、深拷貝的區別

存在賦值、淺拷貝、深拷貝問題的資料型別是對組合物件來說,所謂的組合物件就是包含了其它物件的物件,如列表,類例項。 其他的單個物件則不存在這個問題。 可變物件: list, dict. 不可變物件有: int, string, float, tuple.  

C++ 拷貝建構函式過載操作符不能相互呼叫

拷貝建構函式呼叫過載賦值操作符,過載賦值操作符呼叫拷貝建構函式的寫法都是沒有意義的。首先:拷貝建構函式的存在意義--------是通過已有的物件構造新的物件,構造完畢後才有兩個物件;過載賦值操作符的意義-----------將一個物件的值賦給另一個物件,兩個物件都已經構造完畢了。拷貝建構函式----呼叫---

關於拷貝建構函式過載操作符

拷貝建構函式和過載賦值操作符一般都是一起出現的。 拷貝建構函式: A(const A &rhs) { name=rhs.name; age=new int(); *age=*rhs.age; } 過載賦值操作符: A& operator

c++ 中重寫操作符遇到的問題

c++工程目錄結構: currency.h程式碼如下: #include <cstdlib> #include <iostream> using namespace std; #ifndef CURRENCY_H #define CURRENCY

操作符拷貝建構函式呼叫的情況比較

C++ 拷貝建構函式和賦值運算子 本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式、什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。 拷貝建構函式和賦值運算子 在預設情況下(使用者沒有定義,但是也沒有顯式的刪除),編譯器會自動的隱式生成一個

c++拷貝建構函式操作符過載

c++拷貝建構函式: class A { A(const A& a); .... } 由於拷貝建構函式中,一般不允許對原物件進行修改,因此一般在引數中使用const關鍵字進行限制。 拷貝建構函式一般用於需要new記憶體等操作。如果不允許使用拷貝建

C++筆記之為什麼一個定義了解構函式就幾乎肯定要定義拷貝建構函式拷貝運算子

這個問題本來很簡單,但是時間久了就容易忘,所以做個筆記用來提示下自己 先來看看這樣一個類: class HasPtr { public: HasPtr(const string& s = string()) :ps(new string(s)), i(0) {

C++的六大函數--構造、析構、拷貝構造、移動構造、拷貝、移動

con 析構 mil cit 分享 新的 進入 ons 移動 1.拷貝構造函數和移動構造函數 總的來說,都是用一個已有的對象去創建構造一個新的對象。 當對象中含有指針或類作為數據成員的,對於已有的對象在構造出新的對象後,仍需要對該已有對象進行引用或利用的,需要我們自己定

ES6新特性解構(上)

變量賦值 什麽 模式 註意 只需要 一個數 html 代碼 內容 1:什麽是解構賦值 按照一貫的套路,接下來的內容是解釋:什麽是解構賦值? 來看看官方的解釋: ES6允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構(

C++11六大函數(構造函數,移動構造函數,移動操作符,復制構造函數,操作符,析構函數)

his 類對象 多個 post highlight water iss 重獲新生 amp 在C++中,有三大函數復制控制(復制構造函數,賦值操作符,析構函數),而在C++11中,加入了移動構造函數,移動賦值操作符。我就鬥膽將他們命名為六大函數好了。 一、構造函數 c++

Go語言之如何給*int32

go *int32類型賦值 直接上代碼: package main import "fmt" func main() { var num *int32 var i int32 = 5 // 針對*int32的,先創建一個i類型,然後取i的地址,賦值給*int32

操作符、比較操作符、算術操作符、邏輯操作符、位域操作符

include pause 比較操作符 int clu put nbsp pan code 賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符 , 如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“&l