(GeekBand)C++面向對象高級編程(上)第一周筆記(1)

第一節 C++編程簡介

一、學習課程的前導知識

曾經學過一門編程語言(C為最佳),理解一些基礎常用的名詞,如:變量(variables),類型(types),作用域(scope),循環(loops),流程控制。
了解程序執行的前提:編譯,執行。
了解如何編譯,執行。

二、學習課程的目標

培養正規的、大氣的編程習慣

以良好的方式編寫C++ class
(基于對象 Object Based)

  • class with pointer members(Complex)
  • class with pointer members(String)

學習class之間的關系
(面向對象 Object Oriented)

  • 繼承
  • 復合
  • 委托

三、C++的歷史

  • B語言(1969)
  • C語言(1972)
  • C++語言(1983)
    (new C->C with Class->C++)
  • Java語言
  • C#語言

四、C++的演化

C++分為C++語言和C++標準庫兩個部分。

  • C++98(1.0)
  • C++03(TR1)
  • C++11(2.0)
  • C++14

五、推薦書單

  • 《C++ Primer》
  • 《C++ PROGRAMMING LANGUAGE》
  • 《Effective C++》
  • 《THE C++ STANDARD LIBRARY》
  • 《STL源碼剖析》

第二節 頭文件與類的聲明

回頭看看發現第一節的筆記完全就是copy了侯老師的ppt…<+.+>!…這節來換個風格,嘿嘿。這節課的內容不多也很簡單,就挑兩個相對重要的知識點分享一下吧。

一、 c++ programs

我們在開始寫代碼之前,一定要對自己即將實現的東西有個大概的構想。下面是一個C++ programs代碼的基本形式。

//lalala.h文件

class lalala
{
pirvate:
    //
public:
    //
};

//test.cpp文件(入口)

#include<iostream>        
#include<string>        //標準庫頭文件
#include"lalala.h"      //自寫頭文件
using namespace std;
int main()
{

    return 0;
}

也就是說一個標準的C++ programs通常要包含.h文件,.cpp文件,有時也會調用c++標準庫的頭文件。

二、防衛式聲明(guard)

在我們觀察大牛或者視頻學習的過程中,總會在他們的頭文件中看到下面的代碼,那么它究竟有什么用呢?

#ifndef LALALA_H
#define LALALA_H

/////

#endif

簡單來說,這是通過宏功能來防止重復調用該頭文件。

#ifndef LALALA_H  //如果LALALA_H這里沒有被使用
#define LALALA_H  //則將下方的內容進行宏替換到LALALA_H

/*替換內容*/

#endif  //結束替換

讓我們來試驗一下。

現在我寫了三個文件,分別是test.cpp(入口),lalala.h,lalala1.h。它們的定義如下圖所示。

//test.cpp


#include<iostream>
#include"lalala.h"
#include"lalala1.h"
using namespace std;
int main()
{
    lalala a;
    return 0;
} 

//lalala.h

//#ifndef LALALA_H
//#define LALALA_H
class lalala
{
private:
    //
public:
    //
};
//#endif

//lalala1.h

#include"lalala.h"

它們的包含關系如下圖所示:

這樣一來test.cpp就包含了兩個lalala.h,在編譯時會提示“‘class’ type redefinition”。這時只需要為重復調用的頭文件lalala.h加上防衛式聲明即可(注釋掉的部分)。為了保險起見,不論是否有被重復調用的可能,我們都為頭文件加上這樣的聲明。

第三節 構造函數

來分享下這堂課的心得。

  • class函數可以在類內定義(inline)也可以在類外定義
  • 盡量為所有function使用inline修飾
  • 能否成為inline函數最終取決于編譯器
  • 變量的初始化分兩步,第一步為創建,第二步為賦值。參數列表是在第一步創建變量時進行初始化,所在類中盡可能使用參數列表而非賦值進行初始化
  • 內容不多,相對簡單,就分享這么多吧。

第四節 參數傳遞與返回值

這節內容比較有趣,分享一下~

  • 構造函數可以放在private中(例如Singleton設計模式中)
  • 盡量為只進行讀操作的函數使用const修飾(在函數名之后,例如double real() const{…})
  • 接口是一個類的框架
  • 用const修飾實例則實例為一個常量,其中的函數只有讀權限(即使用const修飾函數)
  • pass by value(值)/reference(to const)(引用,指針4字節)盡可能選擇后者
  • 引用是一種受限制的指針,類似棧,隊列與鏈表的關系
  • pass by referennce通常使用在兩種場景,一種是用作參數傳遞,另一種為返回值傳遞。做參數傳遞時盡可能使用const修飾(除非打算修改其中的值)。當在返回值傳遞時,不可以使用在local object上(函數執行完畢會被銷毀,其中變量的引用會指向一個不明確的地方)
  • friend友元函數會破壞class的封裝性,不宜多用
  • 相同class的各個object互為友元(complex c1,c2 將c1作為參數傳進c2中的成員函數func(),func()函數可以調用參數c1的私有成員)
  • _doapl=>do assignment plus
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容