跟java沒區(qū)別 都是同樣的方法名,不同的參數(shù)。
缺省參數(shù)的函數(shù)
成都創(chuàng)新互聯(lián)專注于孝昌企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站開發(fā)。孝昌網(wǎng)站建設(shè)公司,為孝昌等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站開發(fā),專業(yè)設(shè)計,全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)#include <iostream>
using namespace std;
class A{
public:
void set(int =30,int=5);
void count(bool=false);
private:
int w;
int h;
};
void A::set(int width,int height){
w=width;
h=height;
}
void A::count(bool val){
if(val==true){
cout<<"val的值為真時:"<<w*h<<endl;
}else{
cout<<"val的值為假時:"<<w*h/2<<endl;
}
}
int main(){
A a;
a.set();
a.count();
}
c++中可以寫這種缺省的函數(shù),java中應(yīng)該是不可以,我個人沒寫過,也沒有見別人寫過,時間有限就不寫demo測試了,有興趣的可以試下。
不過似乎c++中這種默認(rèn)的方法必須 不是內(nèi)聯(lián)函數(shù)才行,也就是聲明跟方法分開寫。
成員變量初始化
c++中有一種特殊類的成員變量初始化的寫法
例:
class rectangle{
public:
rectangle():length(3),width(5){}
private:
const int length;
const int width;
}
在構(gòu)造函數(shù)的右邊有個冒號 (:),然后是成員變量的名稱和一對小括號(),小括號中是要初始化的值或者表達(dá)式,如果對多個成員進(jìn)行初始化,那么就要用逗號將它們隔開,最后是一對大
括號{},大括號中就是函數(shù)所要執(zhí)行的功能。
這種方式是對成員變量的初始化,而 rectangle(){length=3;}這種方式是對成員進(jìn)行賦值,當(dāng)成員有const修飾符 是常量時,賦值的方式就會報錯。
對于像常量和引用只能被初始化,不能被賦值.我們最好在構(gòu)造函數(shù)的函數(shù)頭中對常量和引用進(jìn)行初始化。
復(fù)制構(gòu)造函數(shù)
class A{
public :
A(){}
A(A&one){n=one.n;m=one.m;}//這是復(fù)制構(gòu)造函數(shù),系統(tǒng)默認(rèn)就有的,我們可以復(fù)寫也可以不管,在引用一節(jié)有關(guān)于這個的測試。
A(int i,int j){n=i;m=j;}
void print(){
cout<<n<<m;
}
private:
int n;
int m;
}
int main(){
A a(2,4);
a.print();
cout<<"
";
A b(a);
return 0;
}
構(gòu)造函數(shù)與new運(yùn)算符
在c++中創(chuàng)建實(shí)力對象,是通過指針來引向內(nèi)存空間的。
A *a;
a=new A;
a->set(3,4);
而java中 是 A a=new A();
explicit關(guān)鍵字
class A{
public:
explicit A(int x){i=x;cout<<"構(gòu)造函數(shù)執(zhí)行!"<<i<<endl;}
~A(){cout<<"析構(gòu)函數(shù)執(zhí)行!"<<i<<endl;}
void get(){cout<<i<<endl;}
private:
int i;
};
int main(){
A a(99);
a.get();
a=1000; //對于c++來說 這句話相當(dāng)于 a=A(1000);會自動調(diào)用默認(rèn)構(gòu)造函數(shù),當(dāng)加上explicit關(guān)鍵字時,就不會進(jìn)行隱式轉(zhuǎn)換了。
return;
}
復(fù)制構(gòu)造函數(shù)
編譯器提供了默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù),同樣也提供了復(fù)制構(gòu)造函數(shù),編譯器提供的默認(rèn)復(fù)制構(gòu)造函數(shù)只是把傳遞進(jìn)來的對象的每個成員變量復(fù)制到新對象的成員變量中去,然后兩個對象中
的變量均指向存放類成員變量的那塊內(nèi)存區(qū)域.加入該變量不是指針變量一般不會立即出錯,加入該變量是指針變量,如圖:(圖片插入總失敗 我就簡單的表示下吧)
對象a -->堆<-- 復(fù)制的對象b
指針變量x 6 指針成員變量x
現(xiàn)在對象a 有一個指針成員變量x,它指向堆中存放6的那塊內(nèi)存區(qū)域,我們將對象a復(fù)制到對象b,如: A b=(a); 由于要復(fù)制對象,因此自動調(diào)用默認(rèn)復(fù)制構(gòu)造函數(shù),調(diào)用的過程為為:
首先將對象a作為參數(shù)傳遞到默認(rèn)復(fù)制構(gòu)造函數(shù)中,然后將對象a的指針成員變量x復(fù)制到對象b中,這樣兩個對象的指針x現(xiàn)在都指向同一內(nèi)存區(qū)域。
這樣當(dāng)這兩個對象中的任何一個超出作用域時,都會出現(xiàn)致命的錯誤。比如說我們將對象a刪除,那么析構(gòu)函數(shù)會自動釋放堆中存放6的那塊內(nèi)存空間,而對象b的指針變量x扔指向該空間,
由于該空間已經(jīng)不在,那么對象b的指針變量x現(xiàn)在就變成了一個迷途指針,該程序面臨崩潰的邊緣。
為了解決淺層復(fù)制導(dǎo)致的迷途指針問題,我們必須創(chuàng)建自己的復(fù)制構(gòu)造函數(shù),并且在函數(shù)里為我們的成員變量分配內(nèi)存,這樣,在分配完內(nèi)存后,舊對象的成員變量就可以復(fù)制到新的內(nèi)存區(qū)域
中,兩個對象的成員變量都各自擁有自己的內(nèi)存區(qū)域,一個對象在析構(gòu)后不再會影響到另一個,我們把這種復(fù)制方式叫做深層復(fù)制。例:
class A{
public:
A(){x=new int;*x=5;}
~A(){delete x;x=NULL;}
//定義一個深層的復(fù)制構(gòu)造函數(shù)
A(const A&a){//因?yàn)樵谶@個函數(shù)體中不會修改別名a所引用的原始對象的值.所以將別名a定義為別名常量。這樣加入我們試圖修改傳遞進(jìn)來的對象,程序就會報錯。
cout<<"復(fù)制構(gòu)造函數(shù)執(zhí)行...
"<<endl;
x=new int;//用復(fù)制構(gòu)造函數(shù)創(chuàng)建的新對象的指針成員x來指向它。這樣兩個對象的x指針都指向了不同的內(nèi)存空間。
*x=*(a.x);//先通過對象a調(diào)用x指針成員后,再通過"*"讀取x指針指向的空間處的值。
}
void print()const{cout<<*x<<endl;}
void set(int i){*x=i;}
private:
int *x;
}
網(wǎng)頁題目:(六)深入函數(shù)-創(chuàng)新互聯(lián)
URL地址:http://jinyejixie.com/article46/jeoeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、電子商務(wù)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容