小古銀的官方**(完整教程):
this
鞏固練習
#include // std::cout std::endl
class test
;int main(void)
test::test(const test &)
void test::operator=(const test &)
輸出結果:
呼叫複製賦值運算子
上面**中過載了賦值運算子=
,從輸出結果可以看出,**中的=
呼叫的是過載的賦值運算子=
。不過,就算去掉過載的=
,同樣也是不會呼叫複製建構函式。
複製建構函式和移動建構函式只能在初始化的時候呼叫的。上面**中obj2 = obj1
的時候,兩個物件都已經初始化建立完畢。物件建立完後的=
賦值操作都是呼叫複製賦值運算子和移動賦值運算子。
在前面講解預設和刪除的時候講解過,當類不宣告定義複製賦值運算子和移動賦值運算子時就會有預設複製賦值運算子和預設移動賦值運算子。
在沒有寫出複製賦值運算子和移動賦值運算子的情況下,就會存在預設複製賦值運算子和預設移動賦值運算子,對應的就是所有成員變數逐個複製和逐個移動。
在寫出複製賦值運算子函式但沒有寫出移動賦值運算子函式的情況下,當初始值是左值時,將呼叫複製賦值運算子函式;當初始值是右值時,也是呼叫複製賦值運算子函式。
在寫出移動賦值運算子函式但沒有寫出複製賦值運算子函式的情況下,當初始值是左值時,編譯報錯;當初始值是右值時,將呼叫移動賦值運算子函式。
在寫出複製賦值運算子函式和移動賦值運算子函式的情況下,當初始值是左值時,將呼叫複製賦值運算子函式;當初始值是右值時,將呼叫移動賦值運算子函式。
可以發現,複製/移動賦值運算子的情況跟複製/移動建構函式的情況類似。
按照慣例,如果過載運算子=
用於複製或者轉移時,一般返回物件自身的引用。這樣就可以使用連續的等於號來賦值,假設上面**中obj2 = obj1;
,當它賦值完後就會返回obj2
的引用。那麼,再假設我加一條語句:
auto obj3 = obj2 = obj1;
這樣obj1
的值就會複製給obj2
,然後返回obj2
自身的引用,接著使用這個引用,就可以將obj2
的值複製給obj3
。所以上面**可以進一步修改。
那麼,如何使operator=()
函式返回物件自身?這時候可以借助關鍵字this
,一般叫做this
指標。在類中,this
指標代表著物件的記憶體位址,而且它是const
限制的,因此它儲存的位址是不能改變的。這樣說明不好理解,先看看下面例子:
#include class test
};int main(void)
執行輸出後就可以看到前兩個的位址是相同的,後兩個的位址也是相同的,而test1
和test2
的記憶體位址是不同的。所以每個物件裡面的this
指標就是物件自身的記憶體位址,在類中使用this
指標用來統一代表不同的物件的記憶體位址,這樣就可以愉快的寫**了。(或者作為初學者的你可能理解this
指標有點困難,只要多寫**,就能很快理解this
指標,加油吧)。
那麼我們既然知道了this
指標,現在就可以馬上改寫過載運算子=
:
#include // std::cout std::endl
class test
;int main(void)
test & test::operator=(const test &)
只要operator=()
函式返回自身引用,那麼物件就可以使用連續使用等於號賦值,否則只能像下面**這樣拆開:
obj2 = obj1;
obj3 = obj2;
我們的******_vector
只顯式地寫了複製建構函式而沒有顯示地過載賦值運算子,那麼現在,如果******_vector
的物件建立後再賦值的話,它將會呼叫預設複製賦值運算子,那麼複製的情況就跟預設複製建構函式一樣,會出現指標直接賦值。為了防止複製或轉移出錯,******_vector
必須明確寫出複製賦值運算子函式或移動賦值運算子函式。
為******_vector
完成以下成員函式:
// 複製賦值
******_vector & operator=(const ******_vector &x);
// 轉移賦值
******_vector & operator=(******_vector &&x);
當完成了這個賦值運算子過載之後,******_vector
就已經算是完整的類了,這個設計也就大功告成了。 Python入門教程 條件運算子 遞迴和推導
條件運算子 表示式1 表示式2 表示式3 三元表示式 value when true if condition else value when false a if true else b if true aelse b a if false else b if false belse aand o...
python入門教程之基本算術運算子
一 算術運算子 運算子 冪 求次方 取整除,向下取整 如 9 2 4 二 比較運算子 運算子 不等於,類似!舉例說明 x 10 y 20 print x y false print x y true print x y false print x y true print x y false pri...
筆記 C 基礎入門(十二) C 的賦值運算子
除了賦值運算子 還有其他的賦值運算子 加賦值 先加後賦值。請看下面的例子 int x 5 x 2 這句等同於x x 2 執行後,x的值為7 減賦值 先減後賦值。請看下面的例子 int x 5 x 2 這句等同於x x 2 執行後,x的值為3 乘賦值 先乘後賦值。請看下面的例子 int x 5 x 2...