面向對象編程(C++篇1)——引言

1. 概述

現代C++與最原始的版本已經差不多是兩種不同的語言了。不斷髮展的C++標準給C++這門語言帶來了更多的範式和特性,也造就了其非常的難度。但是從個人的體會而言,如此之多的特性沒有必要一項項去硬學,很多的特性沒有實際使用過,體會就不會很深。反而在學了C#,Java,JavaScript這些語言並在實際使用過之後,反而愈發理解了這些語言的編程思想。

現代C++至少有4種編程範式:面向過程、面向對象、泛型和函數式。其中面向對象是最經典的編程思想,最初的時候使用C++的面向對象,總是用成了"C With Class"風格。但是其實在Cpp11之後面向對象有一整套獨特的設計,體現了C++"零成本抽象(zero overhead abstraction)"的設計哲學。

2. 詳論

2.1. 類與對象

任何編程語言都有數據類型的概念,如整型、浮點型等。但是很快,有時候我們發現,全部是單個的數據類型不利於管理,所以有個自定義數據類型。例如,我想定義一個圖像類型:

struct ImageEx
{
    int imgWidth;
    int imgHeight;
    int bandCount;
};

struct最開始是C語言的定義,也就是結構體。通過這個簡單的圖像類型結構體,管理了圖像寬、高以及波段三個參數。通過struct雖然讓編程中有了一定對現實事物的抽象能力,但是這個能力是不足的。主要是缺少像函數一樣的“行爲”能力。而在C++中,對struct做了擴充,我們在其中加入函數來表達行爲(這裏通過函數DoWork()表達對圖像的某種處理):

struct ImageEx
{
    int imgWidth;
    int imgHeight;
    int bandCount;

    void DoWork()
    {

    }
};

像這樣,把數據(屬性)和函數(方法)合成的自定義數據結構,就是類,其具體的實例就是對象,以對象最爲程序設計的基本單位就是面向對象編程。它表達了對客觀事物的抽象,更接近於人的自然認知。

更多的情況下,C++的類採用class關鍵字。class和struct的區別在於,class定義類的數據成員和成員函數默認的訪問權限是public:公有的,能被外部訪問;而struct則是private:私有的,不能被外部訪問。當然,我們最好明確訪問權限:

class ImageEx
{
public:
    void DoWork()
    {

    }

private:
    int imgWidth;
    int imgHeight;
    int bandCount;
};

增加訪問權限控制的好處是進一步加強了類的封裝性。對於任何一個類對象,用戶肯定更關心其行爲方法,而不是其內部屬性部據。因此,通常一個比較好的實現是:方法在前,設爲public,數據在後,設爲private。

進一步的,如果在公有的成員函數很複雜,需要通過調用其他成員函數DoSomething()來實現,那麼這個DoSomething()函數定義成公有還是私有的呢?通常來講,可以定義成私有:

class ImageEx
{
public:
    void DoWork()
    {
        DoSomething();
    }

private:
    void DoSomething()
    {

    }

    int imgWidth;
    int imgHeight;
    int bandCount;
};

這樣,通過數據抽象和封裝,實現了接口與實現的分離。可以認爲類的接口是類的公有成員函數,而類的數據成員、接口實現的函數體、類的私有成員函數是類的實現。類的設計者負責類的具體實現過程,類的用戶則只需要抽象的思考類做了什麼,無需瞭解類型的工作細節。

2.2. 數據類型

在以前經典的編程學習中,會逐漸從數據類型、表達式、語句、函數,最後纔會學到類,接觸面向對象的思想。而在現代以面向對象爲基礎的編程語言(C#、Java、JavaScript)來說:

  1. 類是抽象的自定義數據類型,只不過這個數據類型有自己的屬性和方法,以及一系列表達抽象對象的特性。
  2. 語言內置的數據類型也可以認爲是一種類,事物對象抽象到極致,就是基本的數據類型。

在C#/Java這樣的高級編程語言中,你可以在基本類型中調用其方法;而JavaScript甚至更進一步,弱化了類型這個概念,所有的類型都是隱式的。C++具備像這樣的高級抽象能力,但是也兼容C語言那種低級的基礎數據類型(short、int、long、char、float、double)。這也正體現了C++的多範式編程的特點:如何看待數據類型和類,取決於你採用面向對象的編程思想還是面向過程式的編程思想。

3. 目錄

  1. 面向對象編程(C++篇1)——引言
  2. 面向對象編程(C++篇2)——構造

下一篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章