C++ 物件導向高階設計

tlfclwx發表於2021-05-04

inline關鍵字

  • 類宣告內定義的函式,自動成為inline函式,類宣告外定義的函式,需要加上inline關鍵字才能成為inline函式

建構函式

應該使用列表初始化

class complex {
public:
	complex(double r = 0, double i = 0) : re(r), im(i){}  //列表初始化
private:
	double re, im;
}; 

class complex {
public:
	complex(double r = 0, double i = 0){ re = r; im = i; }  //賦值建構函式
private:
	double re, im;
}; 

列表初始化更快,是理想的初始化方式。

常量成員函式

如果函式內不改變成員函式的值,則可以加上const修飾,更加的保險。

class complex {
public:
	...
	double real() const { return re; }
	double imag() const { return im; }
private:
	double re, im;
}; 
  • 常量物件只能呼叫常量函式,上述成員函式如果不加const, 那complex型別的常量物件則不能呼叫。

引數的值傳遞和引用傳遞

應儘量使用引數的引用傳遞,避免了引數的複製且提高了效率。

返回值的值傳遞和引用傳遞

如果返回值是一個臨時物件,那應該使用值傳遞,因為,一旦離開函式體,內部的臨時物件就沒了,相反,如果傳回的物件是傳入的物件的話,就使用引用傳遞,

ostream物件

對於過載的ostream物件,一般返回值的引數是ostream&, 不是void&, 因為我們輸出的形式一般是cout<<t1<<t2, 連續輸出, 返回ostream& 物件,可以繼續輸出。

友元

友元函式不屬於物件函式,所以不受public,private,protected的限制, 但可以隨意訪問類內的所有成員和函式。
同一個類內的各個物件互為友元,所以在類定義中可以隨意訪問其他物件的私有成員, 如下:

class complex {
public:
        ....
	int func(const complex& parm) {
		return parm.re + parm.im;
	}
private:
	double re, im;
}; 

complex c1, c2;
c1.func(c2);

操作符過載

有兩種方式實現操作符的過載:1. 在類內宣告public型別的函式實現成員函式過載。2. 在類外宣告全域性函式過載。

類內宣告的操作符過載 +=

在類內宣告的操作符過載一般是作用在左運算元上的, 例如:

class complex {
public:
        .....
	friend complex& __dopal(complex*, const complex&);
    complex& operator += (const complex& parm) {
    	return __dopal(this, parm);
	}
private:
	double re, im;
}; 
inline complex& __dopal(complex* ths, const complex& r) {
	ths->re += r.re;
	ths->im += r.im; 
	return *ths;
}
complex c1(1, 2);
c1 += 1;  //過載 +=

對於類內過載的函式,其內隱含著一個this指標,可以像下面這樣理解。

complex& operator += (complex* this, const complex& parm) {
    	return __dopal(this, parm);
	}
  • 注意過載的操作符 += 其返回的引數型別為complex&, 是因為可能不止一個兩個物件相加,可能多個連加: c1 += c2 += c3;
  • 注意不會改動的值或者物件儘量加 const 修飾。

在類外宣告的操作符過載 +

類外宣告的操作符過載,引數不侷限於作用在左運算元,考慮左右運算元的不同形式,所以使用類外過載操作符。

complex c1(2,1);
complex c2;

c2 = c1 + c2;	// 用法1: complex + complex
c2 = c1 + 5;	// 用法2: complex + double
c2 = 7 + c1;	// 用法3: double + complex

在類外宣告函式過載 <<

與過載+的考慮方法類似,<<操作符通常的使用方式是cout<<c1而非c1<<cout,因此不能使用成員函式過載<<運算子.
考慮到形如cout<<c1<<c2<<c3的級聯用法,過載函式的返回值為ostream&而非void.

相關文章