您好,登錄后才能下訂單哦!
本篇內容介紹了“C++中OOP對象和類的詳細介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
C++OOP對象和類
1.預備知識
2.抽象和類
2.1 數據抽象
2.2 類
2.3 接口
3.C++中的類和對象
3.1 C++類的定義
3.2 C++對象的定義
3.3 C++訪問數據成員
3.4 C++類成員函數
本文將從入門的角度介紹C++OOP中的類和對象,事實上C++的類和對象遠遠不止本文所介紹的內容。
不過如果你感興趣,我會把其他的內容逐一通過文章的形式介紹給你。
面向對象編程(OOP)是一種特殊的、設計程序的概念性方法,C++通過一些特性改進了C語言,使得應用這種方法更加容易。下面是最重要的OOP特性:
抽象
封裝和數據隱藏
多態
繼承
代碼可重用性
為了實現上述特性并把它們結合在一起,C++提供了類和對象。
我們首先來討論一下OOP。雖然C++偶爾討論了OOP,但更多的還是諸如C、Pascal和BASIC等語言的標準過程性方法。下面看一個例子,它將揭示OOP的核心觀點與過程性編程的差別。
一般來說一場球賽的進球數量可以通過計算機來輔助計算例如每個選手的投球次數、命中率等等。如果這些由C++等利用OOP編寫程序,我們可以通過在一個函數中調用另一個函數,可以通過構建一個球隊的類,或者建立一個球員的對象,通過調用函數的方式完成計算。而反觀過程性編程,程序員需要用函數調用另一個函數來計算,用數組或變量等記錄結果等等。
總之,如果采用過程性編程,首先考慮的是遵循的步驟,然后再考慮這些數據。
對于OOP程序員,我們需要跟蹤的就是球員,需要用一個對象表示整個選手的各個方面的表現。
采用OOP,首先要從用戶的角度考慮對象——描述對象所需的數據以及描述用戶與數據交互所需的操作。完成接口描述后,需要確定如何實現接口和數據存儲。最后,使用新的設計方案創建出程序。
生活中充滿了復雜性,處理它們的方法就是簡化和抽象。
數據抽象是指,只向外界提供關鍵信息,并隱藏其后臺的實現細節,即只表現必要的信息而不呈現細節。
數據抽象是一種依賴于接口和實現分離的編程(設計)技術。
讓我們舉一個現實生活中的真實例子,比如一臺電視機,您可以打開和關閉、切換頻道、調整音量、添加外部組件(如喇叭、錄像機、DVD 播放器),但是您不知道它的內部實現細節,也就是說,您并不知道它是如何通過纜線接收信號,如何轉換信號,并最終顯示在屏幕上。
因此,我們可以說電視把它的內部實現和外部接口分離開了,您無需知道它的內部實現原理,直接通過它的外部接口(比如電源按鈕、遙控器、聲量控制器)就可以操控電視。
現在,讓我們言歸正傳,就 C++ 編程而言,C++ 類為數據抽象提供了可能。它們向外界提供了大量用于操作對象數據的公共方法,也就是說,外界實際上并不清楚類的內部實現。
例如,您的程序可以調用 sort() 函數,而不需要知道函數中排序數據所用到的算法。實際上,函數排序的底層實現會因庫的版本不同而有所差異,只要接口不變,函數調用就可以照常工作。
類是一種將抽象轉換為用戶定義的C++工具,它將數據表示和操控數據的方法組合成一個整潔的包。下面我們來看看一個表示股票的類。
首先我們需要將股票的一股表示為一個基本單元,定義一個表示一股股票的類,然而,這意味著需要100個股票的單元才能構成100股。這將使工作量超標。相反,我們可以通過將某人持有的某種股票作為一個基本單元,數據表示中包含他所持有的股票數量。
具體地說,我們可以將執行的操作簡化和限制為:
獲得股票
增持
賣出股票
更新股票價格
顯示持股信息
根據上述操作的需求來定義stock類的公共接口,我們可以通過調用接口來完成這些操作。而對于需要儲存的信息,我們將它再次簡化,我們最終將儲存以下信息:
公司名稱
所持股票數量
每股的價格
股票總值
接口是一個共享的框架,共兩個系統交互時使用。例如張三想要把銀行里存的錢取走,需要在銀行或者ATM機取走他在銀行系統里存的錢。
對于類,我們稱為公共接口。在公共接口里,公共(public)是使用類的程序,而接口由程序員提供的調用類方法組成。例如,想要計算string對象包含多少個字符,我們無需打開對象,只需要使用其提供的size方法。方法size()便是用戶與string類之間的公共接口。
C++ 在 C 語言的基礎上增加了面向對象編程,C++ 支持面向對象程序設計。類是 C++ 的核心特性,通常被稱為用戶定義的類型。
類用于指定對象的形式,它包含了數據表示法和用于處理數據的方法。類中的數據和方法稱為類的成員。函數在一個類中被稱為類的成員。
定義一個類,本質上是定義一個數據類型的藍圖。這實際上并沒有定義任何數據,但它定義了類的名稱意味著什么,也就是說,它定義了類的對象包括了什么,以及可以在這個對象上執行哪些操作。
類定義是以關鍵字 class 開頭,后跟類的名稱。類的主體是包含在一對花括號中。類定義后必須跟著一個分號或一個聲明列表。例如,我們使用關鍵字 class 定義 Box 數據類型,如下所示:
class Box { public: double length; // 盒子的長度 double breadth; // 盒子的寬度 double height; // 盒子的高度 };
關鍵字public確定了類成員的訪問屬性。在類對象作用域內,公共成員在類的外部是可訪問的。您也可以指定類的成員為 private或 protected。
類提供了對象的藍圖,所以基本上,對象是根據類來創建的。聲明類的對象,就像聲明基本類型的變量一樣。下面的語句聲明了類 Box 的兩個對象:
Box Box1; // 聲明 Box1,類型為 Box
Box Box2; // 聲明 Box2,類型為 Box
對象 Box1 和 Box2 都有它們各自的數據成員。
類的對象的公共數據成員可以使用直接成員訪問運算符.來訪問。
下面這個例子能幫助你理解上述概念
#include <iostream> using namespace std; class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 // 成員函數聲明 double get(void); void set( double len, double bre, double hei ); }; // 成員函數定義 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; // 用于存儲體積 // 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; }
類的成員函數是指那些把定義和原型寫在類定義內部的函數,就像類定義中的其他變量一樣。類成員函數是類的一個成員,它可以操作類的任意對象,可以訪問對象中的所有成員。
讓我們看看之前定義的類 Box,現在我們要使用成員函數來訪問類的成員,而不是直接訪問這些類的成員:
class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 double getVolume(void);// 返回體積 };
成員函數可以定義在類定義內部,或者單獨使用范圍解析運算符 :: 來定義。在類定義中定義的成員函數把函數聲明為內聯的,即便沒有使用 inline 標識符。所以您可以按照如下方式定義 getVolume() 函數:
class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 double getVolume(void) { return length * breadth * height; } };
您也可以在類的外部使用范圍解析運算符 :: 定義該函數,如下所示:
double Box::getVolume(void) { return length * breadth * height; }
在這里,需要強調一點,在 :: 運算符之前必須使用類名。調用成員函數是在對象上使用點運算符(.),這樣它就能操作與該對象相關的數據。
這里需要注意的是,定義在類中的成員函數缺省都是內聯的,如果在類定義時就在類內給出函數定義,那當然最好。如果在類中未給出成員函數定義,而又想內聯該函數的話,那在類外要加上 inline,否則就認為不是內聯的。例如:
class A { public:void Foo(int x, int y) { } // 自動地成為內聯函數 }
將成員函數的定義體放在類聲明之中雖然能帶來書寫上的方便,但不是一種良好的編程風格,上例應該改成:
// 頭文件 class A { public: void Foo(int x, int y); } // 定義文件 inline void A::Foo(int x, int y){}
inline 是一種用于實現的關鍵字
關鍵字 inline 必須與函數定義體放在一起才能使函數成為內聯,僅將inline 放在函數聲明前面不起任何作用。
如下風格的函數 Foo 不能成為內聯函數:
void Foo(int x, int y); inline void Foo(int x, int y) {} // inline 與函數定義體放在一起
而如下風格的函數Foo 則成為內聯函數:
void Foo(int x, int y);inline void Foo(int x, int y) {} // inline 與函數定義體放在一起
現在我們來梳理一下上面所說的程序,如下所示
#include <iostream> using namespace std; class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 // 成員函數聲明 double getVolume(void); void setLength( double len ); void setBreadth( double bre ); void setHeight( double hei ); }; // 成員函數定義 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; } // 程序的主函數 int main( ) { Box Box1; // 聲明 Box1,類型為 Box Box Box2; // 聲明 Box2,類型為 Box double volume = 0.0; // 用于存儲體積 // 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; }
該程序被編譯后執行,會得到下列輸出
Box1 的體積: 210Box2 的體積: 1560
“C++中OOP對象和類的詳細介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。