1、概述
課程名稱:C++面向對象程序設計
1.1 課程介紹
通過這門課程你能獲得什么?
培養正規、大氣的編程習慣
這門課程無時無刻不在提醒你好的c++編程習慣是什么,讓人第一眼看到你的代碼就覺得你很nice。課程中會有c++編程作業,這些作業會幫助你把這些細碎的知識點串接起來。
以良好的方式編寫c++ class
按照class是否包含指針而將class分為兩大類,課程中會重點強調這兩種class的區別以及處理方法。
作為一門c++面向對象程序設計課程,c++ class無疑算是重點,在這里侯捷老師開門見山,在第一講中就給出了c++ class的一種經典分法,之后的大部分課程都會緊緊圍繞這個分法來講解知識。這種風格讓我有一種提綱挈領地感覺,更對c++ class有了一個更為清晰的認識,非常受用。
掌握class之間的3種關系-繼承、復合、委托
當class之間具備某種關系的時候就是面向對象的,反之單一class就是基于對象的,學習面向對象要從基于對象開始,先要能寫出正確的單一class,這也是這門課程的學習順序。
1.2 推薦書籍
入門書籍:C++ Primer, The C++ Programming Language
進階書籍:Effective C++, The C++ Standard Library, STL源碼剖析
2、上課內容梳理
2.1 Header File規范
2.1.1 要具備防衛式聲明
#ifndef __COMPLEX__
#define __COMPLEX__
.................
.................
#endif
2.1.2 基本的結構
基本上是由一下三部分構成的:
Forward declarations:前置聲明
class ostream;
class complex;
Class declarations:類-聲明
class complex
{
public:
complex (double r = 0, double i = 0): re (r), im (i) { }
complex& operator += (const complex&);
complex& operator -= (const complex&);
complex& operator *= (const complex&);
complex& operator /= (const complex&);
double real () const { return re; }
double imag () const { return im; }
private:
double re, im;
friend complex& __doapl (complex *, const complex&);
friend complex& __doami (complex *, const complex&);
friend complex& __doaml (complex *, const complex&);
};
Class definition:類-定義
inline complex&
complex::operator *= (const complex& r)
{
return __doaml (this, r);
}
2.2 內聯函數
函數如果是在class body內定義完成,便自動成為inline的候選人
2.3 訪問級別
public vs private:一般來說數據都是private屬性的,而函數是public屬性,但是也并不絕對。
{
complex c1(2,1);
cout << c1.re; ?//不被允許,應該使用cout << c1.real();
cout << c1.im; //不被允許,應該使用cout << c1.img();
}
2.4 構造函數
構造函數的完整結構包括以下三個:
1、默認實參;2、初始列;3、賦值。
構造函數會用到overloading的一些功能
在C++的內部實現層面,編譯器會對overloading的構造函數賦予不同的實際名稱
例如:
?real@Complex@@QBENXZ
?real@Complex@@QAENABN@Z
2.5 Const的使用
const 保證得到的數據不被更改
double real() const {return re;}
double imag() const {return im;}
2.6 Return by value VS Return by reference (to const)
我們在編程的時候,
1、應該首先考慮return by reference的用法。
原因是:return by value有可能數據量非常大,而return by reference不會出現這種情況,就是4個4節。
2、要考慮reference 的對象const的屬性
3、何時可以使用return by reference,何時不可以
第一參數將被改變,但是第二參數不改變的情況可以使用:
“+=”的這種情況
但是像temp object是不能使用return by reference,因為他們返回的必定是local object。
inline complex
operator + (double x, const complex& y)
{
return complex (x + real (y), imag (y));
}
inline complex
operator - (const complex& x, const complex& y)
{
return complex (real (x) - real (y), imag (x) - imag (y));
}
4、傳遞著無需知道接受者是以reference接收的
inline complex&
__doapl (complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
2.7 友元
1、友元的特性是可以自由取得friend的private成員
inline complex&
__doapl (complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
2、相同class的各個objects互為友元
2.8 Operator Overloading
在考慮這些函數是否應該成為成員函數,還是非成員函數的時候,要考慮函數的參數是否一定是成員類。