隨筆五 物件賦值

2021-10-04 19:16:13 字數 1542 閱讀 2534

乙個物件被初始化之後再做賦值運算就是物件的賦值,如果物件在做初始化時,進行"="號運算實際上是呼叫拷貝構造。

a a2;

a a = a2;

//拷貝構造

a a3;

//a3已經被初始化,

a3 = a2;

//物件的賦值

a& a::

operator=(

const t& rhs)

return

*this

;}

看到這裡,讀者可能會有一點疑惑,為什麼要判斷一下this != &rhs 呢?也就是說這裡要判斷一下是不是在做 」自己=自己」 的運算。我們知道,物件的賦值實際上就是在做物件資料成員的賦值,那麼就算 「自己=自己」 不加if判斷,直接自己與自己賦值一下又有什麼不可以呢?下面來看一段**:

class

a}

可以看到,指標p指向的記憶體被釋放了,假如 this == &that 那麼釋放this->p指向的記憶體就順便也把 that.p的記憶體釋放掉了。因此預設賦值都會加乙個if 判斷是不是在做自我賦值,如果是,則直接跳過賦值,直接return *this。

其實,在賦值時,指標所帶來的記憶體位址相同的問題不只這裡。 當兩個物件進行賦值時,類中有有指標,則在進行賦值時,兩個不同的物件的指標所指向的記憶體位址是相同的,也就是說並不會為被賦值的物件(左值)的指標再分配一塊記憶體。那麼當兩個物件被析構時,同一塊記憶體會被析構兩次,會報錯。(自己定義了析構函式才會報錯,採用預設的析構函式不會報錯。)

classa;

a(char

*s);

void

fun();

~a()

; a&

operator

=(a& obj)};

intmain()

此時就需要自己定義運算子過載,先delete p

a c = 2; 將int型別的資料隱式轉化成a類,程式會去a類中尋找相應的建構函式: a(int n); 如果找不到的話,就會轉換失敗(當然,a(double n){} 如果有也是可以的 )。

下面來看一段**示例:

classa}

;classbb

(const a&

)//以a為引數的建構函式};

intmain()

explicit關鍵字只能用於修飾只有乙個引數的類建構函式(多個引數、除了第乙個外,其它均預設值的建構函式也可以), 它的作用是表明該建構函式是顯示的, 而非隱式的, 跟它相對應的另乙個關鍵字是implicit, 意思是隱藏的,類建構函式預設情況下即宣告為implicit(隱式).

classa}

;class

bexplicitb(

const a&

)//以a為引數的建構函式};

intmain()

五 物件拷貝

為什麼要使用轉殖 想要處理某個物件,又想將該物件的資料保留下來用於接下來的處理,就需要用到轉殖 clone方法為native方法,產生物件的效率更高 轉殖針對的是物件,而不是類 如何實現轉殖 實現cloneable介面,重寫clone方法 序列化和反序列化 深拷貝和淺拷貝的區別是什麼 深拷貝不但可以...

ES6 物件賦值

1.宣告的變數賦值給物件 let name judy let age 18 let obj console.log obj 2.物件中key值的構建 let key name let obj console.log obj.name wayne3.物件比較object.is var obj1 var...

JS基礎語法(五)物件

現實生活中 萬物皆物件,物件是乙個具體的事物,乙個具體的事物就會有行為和特徵 例如 一部車 乙個手機 車是一類事物,門口停的那輛車才是物件。那麼車的特徵有 紅色 四個輪子 行為有 駕駛 剎車 因為物件可以抽象化一類的事物,方便使用,簡化 function printperson name,age,s...