跟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è)計(jì),全程項(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的值為真時(shí):"<<w*h<<endl;
}else{
cout<<"val的值為假時(shí):"<<w*h/2<<endl;
}
}
int main(){
A a;
a.set();
a.count();
}
c++中可以寫這種缺省的函數(shù),java中應(yīng)該是不可以,我個(gè)人沒寫過,也沒有見別人寫過,時(shí)間有限就不寫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ù)的右邊有個(gè)冒號(hào) (:),然后是成員變量的名稱和一對(duì)小括號(hào)(),小括號(hào)中是要初始化的值或者表達(dá)式,如果對(duì)多個(gè)成員進(jìn)行初始化,那么就要用逗號(hào)將它們隔開,最后是一對(duì)大
括號(hào){},大括號(hào)中就是函數(shù)所要執(zhí)行的功能。
這種方式是對(duì)成員變量的初始化,而 rectangle(){length=3;}這種方式是對(duì)成員進(jìn)行賦值,當(dāng)成員有const修飾符 是常量時(shí),賦值的方式就會(huì)報(bào)錯(cuò)。
對(duì)于像常量和引用只能被初始化,不能被賦值.我們最好在構(gòu)造函數(shù)的函數(shù)頭中對(duì)常量和引用進(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)于這個(gè)的測試。
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í)力對(duì)象,是通過指針來引向內(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; //對(duì)于c++來說 這句話相當(dāng)于 a=A(1000);會(huì)自動(dòng)調(diào)用默認(rèn)構(gòu)造函數(shù),當(dāng)加上explicit關(guān)鍵字時(shí),就不會(huì)進(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)來的對(duì)象的每個(gè)成員變量復(fù)制到新對(duì)象的成員變量中去,然后兩個(gè)對(duì)象中
的變量均指向存放類成員變量的那塊內(nèi)存區(qū)域.加入該變量不是指針變量一般不會(huì)立即出錯(cuò),加入該變量是指針變量,如圖:(圖片插入總失敗 我就簡單的表示下吧)
對(duì)象a -->堆<-- 復(fù)制的對(duì)象b
指針變量x 6 指針成員變量x
現(xiàn)在對(duì)象a 有一個(gè)指針成員變量x,它指向堆中存放6的那塊內(nèi)存區(qū)域,我們將對(duì)象a復(fù)制到對(duì)象b,如: A b=(a); 由于要復(fù)制對(duì)象,因此自動(dòng)調(diào)用默認(rèn)復(fù)制構(gòu)造函數(shù),調(diào)用的過程為為:
首先將對(duì)象a作為參數(shù)傳遞到默認(rèn)復(fù)制構(gòu)造函數(shù)中,然后將對(duì)象a的指針成員變量x復(fù)制到對(duì)象b中,這樣兩個(gè)對(duì)象的指針x現(xiàn)在都指向同一內(nèi)存區(qū)域。
這樣當(dāng)這兩個(gè)對(duì)象中的任何一個(gè)超出作用域時(shí),都會(huì)出現(xiàn)致命的錯(cuò)誤。比如說我們將對(duì)象a刪除,那么析構(gòu)函數(shù)會(huì)自動(dòng)釋放堆中存放6的那塊內(nèi)存空間,而對(duì)象b的指針變量x扔指向該空間,
由于該空間已經(jīng)不在,那么對(duì)象b的指針變量x現(xiàn)在就變成了一個(gè)迷途指針,該程序面臨崩潰的邊緣。
為了解決淺層復(fù)制導(dǎo)致的迷途指針問題,我們必須創(chuàng)建自己的復(fù)制構(gòu)造函數(shù),并且在函數(shù)里為我們的成員變量分配內(nèi)存,這樣,在分配完內(nèi)存后,舊對(duì)象的成員變量就可以復(fù)制到新的內(nèi)存區(qū)域
中,兩個(gè)對(duì)象的成員變量都各自擁有自己的內(nèi)存區(qū)域,一個(gè)對(duì)象在析構(gòu)后不再會(huì)影響到另一個(gè),我們把這種復(fù)制方式叫做深層復(fù)制。例:
class A{
public:
A(){x=new int;*x=5;}
~A(){delete x;x=NULL;}
//定義一個(gè)深層的復(fù)制構(gòu)造函數(shù)
A(const A&a){//因?yàn)樵谶@個(gè)函數(shù)體中不會(huì)修改別名a所引用的原始對(duì)象的值.所以將別名a定義為別名常量。這樣加入我們?cè)噲D修改傳遞進(jìn)來的對(duì)象,程序就會(huì)報(bào)錯(cuò)。
cout<<"復(fù)制構(gòu)造函數(shù)執(zhí)行...
"<<endl;
x=new int;//用復(fù)制構(gòu)造函數(shù)創(chuàng)建的新對(duì)象的指針成員x來指向它。這樣兩個(gè)對(duì)象的x指針都指向了不同的內(nèi)存空間。
*x=*(a.x);//先通過對(duì)象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://aaarwkj.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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容