拷貝問題
預設建構函式小記
作者小記
呼叫本質和方法都在上面。
注意到輸入流和輸出流也可以看成乙個類,和int其實沒有什麼差別,至於&,返回乙個輸出流的引用是因為該類只有乙個,不能拷貝(我的理解目前是這樣,估摸著不怎麼精準,大家將就看哈)
這裡注意後置++是乙個死寫法,記住就好了,int 只是乙個佔位符,為了通過引數的不同達到過載函式的目的
這個通常會和位址掛鉤,故而涉及到淺拷貝和深拷貝的問題,將與拷貝問題一起展示
有位同學不小心把寫了一半的**弄亂了,不僅丟失了一些**,裡面還被小精靈混入了大量不可見的魔國符號,請你幫他把**梳理清楚,並將他的錯誤更正。
using namespace std; class counter
counter(int i) friend counter operator ++(counter &); friend counter operator (counter c1,counter c2); void display() int main()
【輸入形式】
兩個整數
【輸出形式】
乙個整數
【樣例輸入】
5 6【樣例輸出】
解決**示例
#include "iostream"
using namespace std;
class
counter
void
display()
private
: unsigned int value;};
counter operator++
(counter &p)
counter operator *
(counter c1,counter c2)
istream &operator>>
(istream &cin,counter &p)
int main()
怎麼樣,是不是掌握了呢~
淺拷貝:
簡單的賦值拷貝操作,位址也是一樣的
深拷貝:
在堆區中重新申請空間,進行拷貝操作
淺拷貝帶來的問題就是堆區的重複釋放,解決方案便是自己實現拷貝建構函式
棧區的規則是先進後出
自動釋放的記憶體是棧區的變數而不是堆區的
#include
#include
using namespace std;
class
person
//預設建構函式
person
(const person &b)
//深拷貝建構函式
} person & operator=
(const person &b)
//過載賦值運算子};
int main()
示例2
class
person
~person()
}//過載 賦值運算子
person& operator=
(person &p)
m_age=
newint
(*p.m_age)
//深拷貝
return
*this
;//返回物件本身
} int *m_age;};
void
test01()
int main()
//注意: &讀作at,在函式申明的時候是引用的意思,其他的時候才是取位址
classw//
w(int i_a,int i_b):a
(i_a),b
(i_b)
w(int i_a,int i_b)w(
const w&w1)
//有參普通構造
w&operator=
(const w &w1)
//過載賦值運算子};
int main()
過載運算子,拷貝賦值運算子
一 過載運算子 在c語言當中遇到有很多的運算子,如 等等。如果我們用 對兩個物件進行判斷是否相等,系統就不樂意了,它不知道怎麼樣去判斷兩個物件是否相等?比如,我定義了乙個類,class a a obj1 a obj2 if obj1 obj2 錯誤,系統判斷不了 原因分析 系統遇到兩個物件之間的判斷...
拷貝構造與過載賦值運算子
編譯器預設的拷貝建構函式,發生的是memberwise initialization 成員逐一初始化 類的成員變數被逐一複製。而預設賦值運算子,也是逐一複製成員變數。一旦成員變數中,有程式設計師在heap開闢的空間 指標,new 使用預設拷貝建構函式就會引起淺拷貝和深拷貝的問題。include us...
c 中拷貝建構函式與「 運算子過載」
本文只是演示何時呼叫拷貝建構函式,何時用 運算子過載 不考慮類的實現正確。問題 someclass a someclass b a 呼叫的是拷貝建構函式,還是 運算子過載?演示 include class tc tc tc tc a tc operator tc a private int x in...