C++ note 2
9 call by reference 呼叫參考 , return reference 回傳參考
(1)先複習一下 call by pointer
class AAA
{
int value;
public:
AAA(int input=0){x=input;}
friend void disp(AAA *x);
};
void disp(AAA *x)
{
cout<<x->value<<endl;
};
void main()
{
AAA a(4);
disp(&a);
}
這個例子把AAA a的address放到disp(AAA *pt)裡,disp再以pointer存取印出
(2)call by reference 呼叫參考
class AAA
{
int value;
public:
AAA(int input=0){x=input;}
friend void disp(AAA &x);
};
void disp(AAA &x)
{
cout<<x.value<<endl;
}
void main()
{
AAA a(4);
disp(a);
}
這裡的&代表為reference,可以視為別名
ps:這裡可以適當的使用const來限制呼叫的副函數,避免修改到原來的值
(3)以下為回傳參考
int x=10;
int& change(int &x)
{
x+=5;
return x;//回傳參考
}
void main()
{
int &y=change(x);
cout<<"x= "<<x<<endl;
cout<<"y= "<<y<<endl;
}
這裡輸出
x=15;
y=15;
即main裡面的y和外部的x有共同的位址,兩個是一樣的東西
10 this 自己
(1)回傳自己的參考
class NUM
{
int x;
public:
NUM(int initial){x=initial;}
NUM& add(int n)
{
x+=n;
return *this;
}
disp()
{
cout<<"x= "<<x<<endl;
return *this;
}
};
void main()
{
NUM a(100);
a.add(50).disp().add(30).disp();
}
在這個例子中,add回傳NUM的參考,所以可以多次的呼叫add函數
(2)回傳自己的值 比較上例
class NUM
{
int x;
public:
NUM(int initial){x=initial;}
NUM add(int n) //這裡沒有&了!!!
{
x+=n;
return *this;
}
disp()
{
cout<<"x= "<<x<<endl;
return *this;
}
};
void main()
{
NUM a(100);
a.add(50).disp().add(30).disp();
}
在這個例子,雖然是回傳this,只是把所有NUM的東西copy一份丟回去,跟原來的東西
位址不同,輸出的結果也不同
11 constructor, destructor 建構子,解構子
(1) automatic object自動物件是存放在stack中,所以在解構時,以後進先除去
的原則
(2) lifecycle 外部物件>自動物件>副函數
12 overriding 重載/重新定義 polymorphism 多形
overriding:subclass重新定義superclass的function
polymorphism:即superclass和subclass間因函數定義可不同,有不同的行為,此為多形
例:
class SalesPerson
{
double total_amount;
public:
SalesPerson(double a)
{total_amount=a;)
double bonus()
{return total_amount*0.008;}
};
class SalesEngineer:public SalesPerson
{
public:
SalesManager(double a) : SalesPerson(a)
{};
double bonus() //跟superclass一樣的function,但不同定義
{return SalesPerson::bonus()+100.0;}
}
(1) 多形物件的指標: 父類別的指標可以指向子孫類別的物件,使用的函數為父函數
接上例
void main()
{
SalesPerson *p,x(20000.0);
SalesEngineer y(10000.0);
p=&x;
cout<< p->bonus() <<endl; //160
p=&y;
cout<< p->bonus() <<endl; //80,不是180
}
這種依照指標的型態來決定使用的函數稱作Early Binding,早期連結,
另外一種方式稱晚期連結Late Binding,接下來說明
(2) virtual function 虛擬函數
跟上例差不多
class SalesPerson
{
double total_amount;
public:
SalesPerson(double a)
{total_amount=a;)
virtual double bonus() //多了virtual 保留字
{return total_amount*0.008;}
};
class SalesEngineer:public SalesPerson
{
public:
SalesManager(double a) : SalesPerson(a)
{};
double bonus() //自動繼承virtual
{return SalesPerson::bonus()+100.0;}
}
void main()
{
SalesPerson *p,x(20000.0);
SalesEngineer y(10000.0);
p=&x;
cout<< p->bonus() <<endl; //160
p=&y;
cout<< p->bonus() <<endl; //180,不為80,跟上例不同
}
加上了virtual後,變成了late binding,會呼叫類別內的function,而不是依據
pointer內的function
(3)abstract class 抽象類別
含存粹虛擬函數(pure virtual function)的類別稱之 (有點像是概念)
存粹虛擬函數的特徵為:函數的"指令(body)"從缺,例
class SalesPerson //因為含有存粹虛擬函數,所以為抽象類別
{
float total_amount;
public:
SalesPerson(float a){total_amount=a;}
virtual float bonus()=0; //一個存粹虛擬函式格式
}
13 Inheritance 繼承:簡單講就是子女會有父母的特性
(1)有三種繼承方式,以例子來說
public型
class square : public parallelogram
super(父) public -> public sub(子)
protected -> protected
private -> 沒有被繼承(不能自由存取)
protected型
class square : protected parallelogram
super(父) public -> protected sub(子)
protected -> protected
private -> 沒有被繼承(不能自由存取)
private型
class square : private parallelogram
super(父) public -> private sub(子)
protected -> private
private -> 沒有被繼承(不能自由存取)
ps:一個class的資料預設為private
(2)建構子的繼承: 當一個新的子類別(subclass)物件被宣告的時候,會先呼叫
superclass的建構子,在用自己的建構子,以下例子說明
class A
{
public:
A(){cout<<"constructor of A"<<endl;}
~A(){cout<<"destructor of A"<<endl;}
}
clss B : public A //B繼承A
{
public:
B(){cout<<"constructor of B"<<endl;}
~B(){cout<<"destructor of B"<<endl;}
}
void main()
{ B b_object;}
則輸出為
constructor of A
constructor of B
destructor of B
destructor of A
deconstructor的呼叫順序與constructor相反,例
A繼承B B繼承C
宣告時,建構子的呼叫順序為A,B,C
刪除時,解構子的呼叫順序為C,B,A
14 array vs pointer
int x[3];
int *p;
p=&x[0]; //這裡也相當於 p=x;
則這裡 x[i] 等於 p[i] 等於 *(p+i)
5. 多重繼承
class son : public father , public monther
如果father,monther皆是繼承於person這個類別,則這兩個person的東西會被son
同時接收,造成衝突
To be continued
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.21.108
※ 編輯: maxmilian 來自: 140.112.21.108 (12/10 14:06)