GeekBand-C++面向對象高級編程-Lesson1

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

在考慮這些函數是否應該成為成員函數,還是非成員函數的時候,要考慮函數的參數是否一定是成員類。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容