-----------------siwuxie095
以 student 類為例:
先定義了 student 類,在使用時,先例項化 stu1 物件,接著又例項化 stu2
物件,並將
stu1 賦值給 stu2,這樣就使得 stu2 在例項化的過程中擁有 stu1
的值,接著又例項化 stu3 物件,也將 stu1 賦值過來,使得 stu3 擁有了 stu1
裡面的值
但是執行**時卻發現,只列印了一行
student,而沒有像想象的那樣列印
三行,畢竟是例項化了三個物件,理論上應該呼叫三次建構函式
實際上,後兩種例項化物件的方式的確是呼叫了建構函式,但呼叫的不是這裡
定義的建構函式,而是乙個特殊的建構函式,即
拷貝建構函式
拷貝建構函式
拷貝建構函式在定義時,與普通的建構函式基本相同,只是在引數上
有嚴格的要求
如下:
如果將相應的**寫在拷貝建構函式的實現的部分,再採用直接初始化
或複製初始化來例項化物件時,就執行拷貝建構函式中相應的**,而
在例項化
stu2 和 stu3 時並沒有定義拷貝建構函式,仍能把它們例項化
出來,可見:拷貝建構函式與普通的建構函式一樣,系統可自動生成
建構函式總結:
(1)建構函式的分類
(2)如果自定義了普通建構函式和拷貝建構函式,則系統不會
自動生成這兩個函式
(3)初始化列表無論放在普通建構函式的後邊還是拷貝建構函式
的後邊,都有著不可取代的地位
程式:
teacher.h:
#include
using namespacestd;
classteacher ;
teacher.cpp:
#include"teacher.h"
#include
using namespacestd;
teacher::teacher(string name, intage) :m_strname(name), m_iage(age)
teacher::teacher(constteacher &t)
voidteacher::setname(string name)
string teacher::getname()
voidteacher::setage(intage)
intteacher::getage()
main.cpp:
#include
#include"teacher.h"
#include
using namespacestd;
//拷貝建構函式在引數傳遞時也會被自動呼叫
voidtest(teacher t)
intmain(void)
【made by siwuxie095】
拷貝建構函式,預設拷貝建構函式
拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...
建構函式 拷貝建構函式
建構函式可以分為三類 1 不帶引數的建構函式 在函式體中對資料成員賦初值,這種方式使該類的每乙個物件都得到同一組初值 2 帶引數的建構函式 如果使用者希望對不同的物件賦不同的初值,可以採用帶引數的建構函式。在呼叫不同物件的建構函式時從外面將不同的資料傳遞給建構函式,以實現初始化 3 複製建構函式 建...
建構函式 拷貝建構函式
person person 引用就是指標常量 所以person p person const p,引用所以一旦初始化指向某個位址,就不能在改變了。為什麼前面還要加const,因為拷貝建構函式的目的就是將乙個物件的所有屬性拷貝到另外乙個物件,這個物件的屬性不變,加上const 相當於 const pe...