C++OOP對(duì)象和類的詳細(xì)講解
C++OOP對(duì)象和類
本文將從入門的角度介紹C++OOP中的類和對(duì)象,事實(shí)上C++的類和對(duì)象遠(yuǎn)遠(yuǎn)不止本文所介紹的內(nèi)容。
不過如果你感興趣,我會(huì)把其他的內(nèi)容逐一通過文章的形式介紹給你。
1.預(yù)備知識(shí)
面向?qū)ο缶幊蹋∣OP)是一種特殊的、設(shè)計(jì)程序的概念性方法,C++通過一些特性改進(jìn)了C語言,使得應(yīng)用這種方法更加容易。下面是最重要的OOP特性:
- 抽象
- 封裝和數(shù)據(jù)隱藏
- 多態(tài)
- 繼承
- 代碼可重用性
為了實(shí)現(xiàn)上述特性并把它們結(jié)合在一起,C++提供了類和對(duì)象。
我們首先來討論一下OOP。雖然C++偶爾討論了OOP,但更多的還是諸如C、Pascal和BASIC等語言的標(biāo)準(zhǔn)過程性方法。下面看一個(gè)例子,它將揭示OOP的核心觀點(diǎn)與過程性編程的差別。
一般來說一場(chǎng)球賽的進(jìn)球數(shù)量可以通過計(jì)算機(jī)來輔助計(jì)算例如每個(gè)選手的投球次數(shù)、命中率等等。如果這些由C++等利用OOP編寫程序,我們可以通過在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù),可以通過構(gòu)建一個(gè)球隊(duì)的類,或者建立一個(gè)球員的對(duì)象,通過調(diào)用函數(shù)的方式完成計(jì)算。而反觀過程性編程,程序員需要用函數(shù)調(diào)用另一個(gè)函數(shù)來計(jì)算,用數(shù)組或變量等記錄結(jié)果等等。
總之,如果采用過程性編程,首先考慮的是遵循的步驟,然后再考慮這些數(shù)據(jù)。
對(duì)于OOP程序員,我們需要跟蹤的就是球員,需要用一個(gè)對(duì)象表示整個(gè)選手的各個(gè)方面的表現(xiàn)。
采用OOP,首先要從用戶的角度考慮對(duì)象——描述對(duì)象所需的數(shù)據(jù)以及描述用戶與數(shù)據(jù)交互所需的操作。完成接口描述后,需要確定如何實(shí)現(xiàn)接口和數(shù)據(jù)存儲(chǔ)。最后,使用新的設(shè)計(jì)方案創(chuàng)建出程序。
2.抽象和類
生活中充滿了復(fù)雜性,處理它們的方法就是簡(jiǎn)化和抽象。
2.1 數(shù)據(jù)抽象
數(shù)據(jù)抽象是指,只向外界提供關(guān)鍵信息,并隱藏其后臺(tái)的實(shí)現(xiàn)細(xì)節(jié),即只表現(xiàn)必要的信息而不呈現(xiàn)細(xì)節(jié)。
數(shù)據(jù)抽象是一種依賴于接口和實(shí)現(xiàn)分離的編程(設(shè)計(jì))技術(shù)。
讓我們舉一個(gè)現(xiàn)實(shí)生活中的真實(shí)例子,比如一臺(tái)電視機(jī),您可以打開和關(guān)閉、切換頻道、調(diào)整音量、添加外部組件(如喇叭、錄像機(jī)、DVD 播放器),但是您不知道它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也就是說,您并不知道它是如何通過纜線接收信號(hào),如何轉(zhuǎn)換信號(hào),并最終顯示在屏幕上。
因此,我們可以說電視把它的內(nèi)部實(shí)現(xiàn)和外部接口分離開了,您無需知道它的內(nèi)部實(shí)現(xiàn)原理,直接通過它的外部接口(比如電源按鈕、遙控器、聲量控制器)就可以操控電視。
現(xiàn)在,讓我們言歸正傳,就 C++ 編程而言,C++ 類為數(shù)據(jù)抽象提供了可能。它們向外界提供了大量用于操作對(duì)象數(shù)據(jù)的公共方法,也就是說,外界實(shí)際上并不清楚類的內(nèi)部實(shí)現(xiàn)。
例如,您的程序可以調(diào)用 sort() 函數(shù),而不需要知道函數(shù)中排序數(shù)據(jù)所用到的算法。實(shí)際上,函數(shù)排序的底層實(shí)現(xiàn)會(huì)因庫的版本不同而有所差異,只要接口不變,函數(shù)調(diào)用就可以照常工作。
2.2 類
類是一種將抽象轉(zhuǎn)換為用戶定義的C++工具,它將數(shù)據(jù)表示和操控?cái)?shù)據(jù)的方法組合成一個(gè)整潔的包。下面我們來看看一個(gè)表示股票的類。
首先我們需要將股票的一股表示為一個(gè)基本單元,定義一個(gè)表示一股股票的類,然而,這意味著需要100個(gè)股票的單元才能構(gòu)成100股。這將使工作量超標(biāo)。相反,我們可以通過將某人持有的某種股票作為一個(gè)基本單元,數(shù)據(jù)表示中包含他所持有的股票數(shù)量。
具體地說,我們可以將執(zhí)行的操作簡(jiǎn)化和限制為:
- 獲得股票
- 增持
- 賣出股票
- 更新股票價(jià)格
- 顯示持股信息
根據(jù)上述操作的需求來定義stock類的公共接口,我們可以通過調(diào)用接口來完成這些操作。而對(duì)于需要儲(chǔ)存的信息,我們將它再次簡(jiǎn)化,我們最終將儲(chǔ)存以下信息:
- 公司名稱
- 所持股票數(shù)量
- 每股的價(jià)格
- 股票總值
2.3 接口
接口是一個(gè)共享的框架,共兩個(gè)系統(tǒng)交互時(shí)使用。例如張三想要把銀行里存的錢取走,需要在銀行或者ATM機(jī)取走他在銀行系統(tǒng)里存的錢。
對(duì)于類,我們稱為公共接口。在公共接口里,公共(public)是使用類的程序,而接口由程序員提供的調(diào)用類方法組成。例如,想要計(jì)算string對(duì)象包含多少個(gè)字符,我們無需打開對(duì)象,只需要使用其提供的size方法。方法size()便是用戶與string類之間的公共接口。
3.C++中的類和對(duì)象
C++ 在 C 語言的基礎(chǔ)上增加了面向?qū)ο缶幊蹋珻++ 支持面向?qū)ο蟪绦蛟O(shè)計(jì)。類是 C++ 的核心特性,通常被稱為用戶定義的類型。
類用于指定對(duì)象的形式,它包含了數(shù)據(jù)表示法和用于處理數(shù)據(jù)的方法。類中的數(shù)據(jù)和方法稱為類的成員。函數(shù)在一個(gè)類中被稱為類的成員。
3.1 C++類的定義
定義一個(gè)類,本質(zhì)上是定義一個(gè)數(shù)據(jù)類型的藍(lán)圖。這實(shí)際上并沒有定義任何數(shù)據(jù),但它定義了類的名稱意味著什么,也就是說,它定義了類的對(duì)象包括了什么,以及可以在這個(gè)對(duì)象上執(zhí)行哪些操作。
類定義是以關(guān)鍵字 class 開頭,后跟類的名稱。類的主體是包含在一對(duì)花括號(hào)中。類定義后必須跟著一個(gè)分號(hào)或一個(gè)聲明列表。例如,我們使用關(guān)鍵字 class 定義 Box 數(shù)據(jù)類型,如下所示:
class Box { public: double length; // 盒子的長(zhǎng)度 double breadth; // 盒子的寬度 double height; // 盒子的高度 };
關(guān)鍵字public確定了類成員的訪問屬性。在類對(duì)象作用域內(nèi),公共成員在類的外部是可訪問的。您也可以指定類的成員為 private或 protected。
3.2 C++對(duì)象的定義
類提供了對(duì)象的藍(lán)圖,所以基本上,對(duì)象是根據(jù)類來創(chuàng)建的。聲明類的對(duì)象,就像聲明基本類型的變量一樣。下面的語句聲明了類 Box 的兩個(gè)對(duì)象:
Box Box1; // 聲明 Box1,類型為 Box
Box Box2; // 聲明 Box2,類型為 Box
對(duì)象 Box1 和 Box2 都有它們各自的數(shù)據(jù)成員。
3.3 C++訪問數(shù)據(jù)成員
類的對(duì)象的公共數(shù)據(jù)成員可以使用直接成員訪問運(yùn)算符.來訪問。
下面這個(gè)例子能幫助你理解上述概念
#include <iostream> using namespace std; class Box { public: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 // 成員函數(shù)聲明 double get(void); void set( double len, double bre, double hei ); }; // 成員函數(shù)定義 double Box::get(void) { return length * breadth * height; } void Box::set( double len, double bre, double hei) { length = len; breadth = bre; height = hei; } int main( ) { Box Box1; // 聲明 Box1,類型為 Box Box Box2; // 聲明 Box2,類型為 Box Box Box3; // 聲明 Box3,類型為 Box double volume = 0.0; // 用于存儲(chǔ)體積 // box 1 詳述 Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0; // box 2 詳述 Box2.height = 10.0; Box2.length = 12.0; Box2.breadth = 13.0; // box 1 的體積 volume = Box1.height * Box1.length * Box1.breadth; cout << "Box1 的體積:" << volume <<endl; // box 2 的體積 volume = Box2.height * Box2.length * Box2.breadth; cout << "Box2 的體積:" << volume <<endl; // box 3 詳述 Box3.set(16.0, 8.0, 12.0); volume = Box3.get(); cout << "Box3 的體積:" << volume <<endl; return 0; }
3.4 C++類成員函數(shù)
類的成員函數(shù)是指那些把定義和原型寫在類定義內(nèi)部的函數(shù),就像類定義中的其他變量一樣。類成員函數(shù)是類的一個(gè)成員,它可以操作類的任意對(duì)象,可以訪問對(duì)象中的所有成員。
讓我們看看之前定義的類 Box,現(xiàn)在我們要使用成員函數(shù)來訪問類的成員,而不是直接訪問這些類的成員:
class Box { public: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 double getVolume(void);// 返回體積 };
成員函數(shù)可以定義在類定義內(nèi)部,或者單獨(dú)使用范圍解析運(yùn)算符 :: 來定義。在類定義中定義的成員函數(shù)把函數(shù)聲明為內(nèi)聯(lián)的,即便沒有使用 inline 標(biāo)識(shí)符。所以您可以按照如下方式定義 getVolume() 函數(shù):
class Box { public: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 double getVolume(void) { return length * breadth * height; } };
您也可以在類的外部使用范圍解析運(yùn)算符 :: 定義該函數(shù),如下所示:
double Box::getVolume(void) { return length * breadth * height; }
在這里,需要強(qiáng)調(diào)一點(diǎn),在 :: 運(yùn)算符之前必須使用類名。調(diào)用成員函數(shù)是在對(duì)象上使用點(diǎn)運(yùn)算符(.),這樣它就能操作與該對(duì)象相關(guān)的數(shù)據(jù)。
這里需要注意的是,定義在類中的成員函數(shù)缺省都是內(nèi)聯(lián)的,如果在類定義時(shí)就在類內(nèi)給出函數(shù)定義,那當(dāng)然最好。如果在類中未給出成員函數(shù)定義,而又想內(nèi)聯(lián)該函數(shù)的話,那在類外要加上 inline,否則就認(rèn)為不是內(nèi)聯(lián)的。例如:
class A { public:void Foo(int x, int y) { } // 自動(dòng)地成為內(nèi)聯(lián)函數(shù) }
將成員函數(shù)的定義體放在類聲明之中雖然能帶來書寫上的方便,但不是一種良好的編程風(fēng)格,上例應(yīng)該改成:
// 頭文件 class A { public: void Foo(int x, int y); } // 定義文件 inline void A::Foo(int x, int y){}
inline 是一種用于實(shí)現(xiàn)的關(guān)鍵字
關(guān)鍵字 inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline 放在函數(shù)聲明前面不起任何作用。
如下風(fēng)格的函數(shù) Foo 不能成為內(nèi)聯(lián)函數(shù):
void Foo(int x, int y); inline void Foo(int x, int y) {} // inline 與函數(shù)定義體放在一起
而如下風(fēng)格的函數(shù)Foo 則成為內(nèi)聯(lián)函數(shù):
void Foo(int x, int y);inline void Foo(int x, int y) {} // inline 與函數(shù)定義體放在一起
現(xiàn)在我們來梳理一下上面所說的程序,如下所示
#include <iostream> using namespace std; class Box { public: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 // 成員函數(shù)聲明 double getVolume(void); void setLength( double len ); void setBreadth( double bre ); void setHeight( double hei ); }; // 成員函數(shù)定義 double Box::getVolume(void) { return length * breadth * height; } void Box::setLength( double len ) { length = len; } void Box::setBreadth( double bre ) { breadth = bre; } void Box::setHeight( double hei ) { height = hei; } // 程序的主函數(shù) int main( ) { Box Box1; // 聲明 Box1,類型為 Box Box Box2; // 聲明 Box2,類型為 Box double volume = 0.0; // 用于存儲(chǔ)體積 // box 1 詳述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 詳述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // box 1 的體積 volume = Box1.getVolume(); cout << "Box1 的體積:" << volume <<endl; // box 2 的體積 volume = Box2.getVolume(); cout << "Box2 的體積:" << volume <<endl; return 0; }
該程序被編譯后執(zhí)行,會(huì)得到下列輸出
Box1 的體積: 210Box2 的體積: 1560
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(73.矩陣賦零)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(73.矩陣賦零),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動(dòng)校驗(yàn)詳解
用C++做業(yè)務(wù)發(fā)開的同學(xué)是否還在不厭其煩的編寫大量if-else模塊來做接口參數(shù)校驗(yàn)?zāi)兀拷裉?,我們就模擬Java里面通過注解實(shí)現(xiàn)參數(shù)校驗(yàn)的方式來針對(duì)C++?protobuf接口實(shí)現(xiàn)一個(gè)更加方便、快捷的參數(shù)校驗(yàn)自動(dòng)工具,希望對(duì)大家有所幫助2023-04-04C++實(shí)現(xiàn)逆波蘭表達(dá)式的例題詳解
逆波蘭表達(dá)式由波蘭的邏輯學(xué)家盧卡西維茲提出,它的特點(diǎn)是:沒有括號(hào),運(yùn)算符總是放在和它相關(guān)的操作數(shù)之后。本文將通過例題講講如何利用C++實(shí)現(xiàn)逆波蘭表達(dá)式,需要的可以參考一下2022-12-12C語言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09C語言動(dòng)態(tài)內(nèi)存的分配實(shí)例詳解
動(dòng)態(tài)內(nèi)存管理同時(shí)還具有一個(gè)優(yōu)點(diǎn),當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時(shí),不需要重寫程序,下面這篇文章主要給大家介紹了關(guān)于C語言動(dòng)態(tài)內(nèi)存分配的相關(guān)資料,需要的朋友可以參考下2022-06-06