最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++OOP對(duì)象和類(lèi)的詳細(xì)講解

 更新時(shí)間:2021年08月23日 16:12:40   作者:_Chrome_  
這篇文章主要介紹了C++面相對(duì)象編程中的類(lèi)與對(duì)象的特性與概念,OOP面向?qū)ο笳Z(yǔ)言相對(duì)C語(yǔ)言這樣面相過(guò)程的語(yǔ)言來(lái)說(shuō)具有類(lèi)和對(duì)象以及方法這樣的特性,需要的朋友可以參考下

C++OOP對(duì)象和類(lèi)

本文將從入門(mén)的角度介紹C++OOP中的類(lèi)和對(duì)象,事實(shí)上C++的類(lèi)和對(duì)象遠(yuǎn)遠(yuǎn)不止本文所介紹的內(nèi)容。

不過(guò)如果你感興趣,我會(huì)把其他的內(nèi)容逐一通過(guò)文章的形式介紹給你。

1.預(yù)備知識(shí)

面向?qū)ο缶幊蹋∣OP)是一種特殊的、設(shè)計(jì)程序的概念性方法,C++通過(guò)一些特性改進(jìn)了C語(yǔ)言,使得應(yīng)用這種方法更加容易。下面是最重要的OOP特性:

  • 抽象
  • 封裝和數(shù)據(jù)隱藏
  • 多態(tài)
  • 繼承
  • 代碼可重用性

為了實(shí)現(xiàn)上述特性并把它們結(jié)合在一起,C++提供了類(lèi)和對(duì)象。

我們首先來(lái)討論一下OOP。雖然C++偶爾討論了OOP,但更多的還是諸如C、Pascal和BASIC等語(yǔ)言的標(biāo)準(zhǔn)過(guò)程性方法。下面看一個(gè)例子,它將揭示OOP的核心觀(guān)點(diǎn)與過(guò)程性編程的差別。

一般來(lái)說(shuō)一場(chǎng)球賽的進(jìn)球數(shù)量可以通過(guò)計(jì)算機(jī)來(lái)輔助計(jì)算例如每個(gè)選手的投球次數(shù)、命中率等等。如果這些由C++等利用OOP編寫(xiě)程序,我們可以通過(guò)在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù),可以通過(guò)構(gòu)建一個(gè)球隊(duì)的類(lèi),或者建立一個(gè)球員的對(duì)象,通過(guò)調(diào)用函數(shù)的方式完成計(jì)算。而反觀(guān)過(guò)程性編程,程序員需要用函數(shù)調(diào)用另一個(gè)函數(shù)來(lái)計(jì)算,用數(shù)組或變量等記錄結(jié)果等等。

總之,如果采用過(guò)程性編程,首先考慮的是遵循的步驟,然后再考慮這些數(shù)據(jù)。

對(duì)于OOP程序員,我們需要跟蹤的就是球員,需要用一個(gè)對(duì)象表示整個(gè)選手的各個(gè)方面的表現(xiàn)。

采用OOP,首先要從用戶(hù)的角度考慮對(duì)象——描述對(duì)象所需的數(shù)據(jù)以及描述用戶(hù)與數(shù)據(jù)交互所需的操作。完成接口描述后,需要確定如何實(shí)現(xiàn)接口和數(shù)據(jù)存儲(chǔ)。最后,使用新的設(shè)計(jì)方案創(chuàng)建出程序。

2.抽象和類(lèi)

生活中充滿(mǎn)了復(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ù)抽象是一種依賴(lài)于接口和實(shí)現(xiàn)分離的編程(設(shè)計(jì))技術(shù)。

讓我們舉一個(gè)現(xiàn)實(shí)生活中的真實(shí)例子,比如一臺(tái)電視機(jī),您可以打開(kāi)和關(guān)閉、切換頻道、調(diào)整音量、添加外部組件(如喇叭、錄像機(jī)、DVD 播放器),但是您不知道它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也就是說(shuō),您并不知道它是如何通過(guò)纜線(xiàn)接收信號(hào),如何轉(zhuǎn)換信號(hào),并最終顯示在屏幕上。

因此,我們可以說(shuō)電視把它的內(nèi)部實(shí)現(xiàn)和外部接口分離開(kāi)了,您無(wú)需知道它的內(nèi)部實(shí)現(xiàn)原理,直接通過(guò)它的外部接口(比如電源按鈕、遙控器、聲量控制器)就可以操控電視。

現(xiàn)在,讓我們言歸正傳,就 C++ 編程而言,C++ 類(lèi)為數(shù)據(jù)抽象提供了可能。它們向外界提供了大量用于操作對(duì)象數(shù)據(jù)的公共方法,也就是說(shuō),外界實(shí)際上并不清楚類(lèi)的內(nèi)部實(shí)現(xiàn)。

例如,您的程序可以調(diào)用 sort() 函數(shù),而不需要知道函數(shù)中排序數(shù)據(jù)所用到的算法。實(shí)際上,函數(shù)排序的底層實(shí)現(xiàn)會(huì)因庫(kù)的版本不同而有所差異,只要接口不變,函數(shù)調(diào)用就可以照常工作。

2.2 類(lèi)

類(lèi)是一種將抽象轉(zhuǎn)換為用戶(hù)定義的C++工具,它將數(shù)據(jù)表示和操控?cái)?shù)據(jù)的方法組合成一個(gè)整潔的包。下面我們來(lái)看看一個(gè)表示股票的類(lèi)。

首先我們需要將股票的一股表示為一個(gè)基本單元,定義一個(gè)表示一股股票的類(lèi),然而,這意味著需要100個(gè)股票的單元才能構(gòu)成100股。這將使工作量超標(biāo)。相反,我們可以通過(guò)將某人持有的某種股票作為一個(gè)基本單元,數(shù)據(jù)表示中包含他所持有的股票數(shù)量。

具體地說(shuō),我們可以將執(zhí)行的操作簡(jiǎn)化和限制為:

  • 獲得股票
  • 增持
  • 賣(mài)出股票
  • 更新股票價(jià)格
  • 顯示持股信息

根據(jù)上述操作的需求來(lái)定義stock類(lèi)的公共接口,我們可以通過(guò)調(diào)用接口來(lái)完成這些操作。而對(duì)于需要儲(chǔ)存的信息,我們將它再次簡(jiǎn)化,我們最終將儲(chǔ)存以下信息:

  • 公司名稱(chēng)
  • 所持股票數(shù)量
  • 每股的價(jià)格
  • 股票總值

2.3 接口

接口是一個(gè)共享的框架,共兩個(gè)系統(tǒng)交互時(shí)使用。例如張三想要把銀行里存的錢(qián)取走,需要在銀行或者ATM機(jī)取走他在銀行系統(tǒng)里存的錢(qián)。

對(duì)于類(lèi),我們稱(chēng)為公共接口。在公共接口里,公共(public)是使用類(lèi)的程序,而接口由程序員提供的調(diào)用類(lèi)方法組成。例如,想要計(jì)算string對(duì)象包含多少個(gè)字符,我們無(wú)需打開(kāi)對(duì)象,只需要使用其提供的size方法。方法size()便是用戶(hù)與string類(lèi)之間的公共接口。

3.C++中的類(lèi)和對(duì)象

C++ 在 C 語(yǔ)言的基礎(chǔ)上增加了面向?qū)ο缶幊?,C++ 支持面向?qū)ο蟪绦蛟O(shè)計(jì)。類(lèi)是 C++ 的核心特性,通常被稱(chēng)為用戶(hù)定義的類(lèi)型。

類(lèi)用于指定對(duì)象的形式,它包含了數(shù)據(jù)表示法和用于處理數(shù)據(jù)的方法。類(lèi)中的數(shù)據(jù)和方法稱(chēng)為類(lèi)的成員。函數(shù)在一個(gè)類(lèi)中被稱(chēng)為類(lèi)的成員。

3.1 C++類(lèi)的定義

定義一個(gè)類(lèi),本質(zhì)上是定義一個(gè)數(shù)據(jù)類(lèi)型的藍(lán)圖。這實(shí)際上并沒(méi)有定義任何數(shù)據(jù),但它定義了類(lèi)的名稱(chēng)意味著什么,也就是說(shuō),它定義了類(lèi)的對(duì)象包括了什么,以及可以在這個(gè)對(duì)象上執(zhí)行哪些操作。

C++類(lèi)的結(jié)構(gòu)

類(lèi)定義是以關(guān)鍵字 class 開(kāi)頭,后跟類(lèi)的名稱(chēng)。類(lèi)的主體是包含在一對(duì)花括號(hào)中。類(lèi)定義后必須跟著一個(gè)分號(hào)或一個(gè)聲明列表。例如,我們使用關(guān)鍵字 class 定義 Box 數(shù)據(jù)類(lèi)型,如下所示:

class Box {   
    public:      
    double length;   // 盒子的長(zhǎng)度      
    double breadth;  // 盒子的寬度      
    double height;   // 盒子的高度 
};

關(guān)鍵字public確定了類(lèi)成員的訪(fǎng)問(wèn)屬性。在類(lèi)對(duì)象作用域內(nèi),公共成員在類(lèi)的外部是可訪(fǎng)問(wèn)的。您也可以指定類(lèi)的成員為 private或 protected。

3.2 C++對(duì)象的定義

類(lèi)提供了對(duì)象的藍(lán)圖,所以基本上,對(duì)象是根據(jù)類(lèi)來(lái)創(chuàng)建的。聲明類(lèi)的對(duì)象,就像聲明基本類(lèi)型的變量一樣。下面的語(yǔ)句聲明了類(lèi) Box 的兩個(gè)對(duì)象:

Box Box1;          // 聲明 Box1,類(lèi)型為 Box
Box Box2;          // 聲明 Box2,類(lèi)型為 Box

對(duì)象 Box1 和 Box2 都有它們各自的數(shù)據(jù)成員。

3.3 C++訪(fǎng)問(wèn)數(shù)據(jù)成員

類(lèi)的對(duì)象的公共數(shù)據(jù)成員可以使用直接成員訪(fǎng)問(wèn)運(yùn)算符.來(lái)訪(fǎng)問(wè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,類(lèi)型為 Box
   Box Box2;        // 聲明 Box2,類(lèi)型為 Box
   Box Box3;        // 聲明 Box3,類(lèi)型為 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++類(lèi)成員函數(shù)

類(lèi)的成員函數(shù)是指那些把定義和原型寫(xiě)在類(lèi)定義內(nèi)部的函數(shù),就像類(lèi)定義中的其他變量一樣。類(lèi)成員函數(shù)是類(lèi)的一個(gè)成員,它可以操作類(lèi)的任意對(duì)象,可以訪(fǎng)問(wèn)對(duì)象中的所有成員。

讓我們看看之前定義的類(lèi) Box,現(xiàn)在我們要使用成員函數(shù)來(lái)訪(fǎng)問(wèn)類(lèi)的成員,而不是直接訪(fǎng)問(wèn)這些類(lèi)的成員:

class Box
{
   public:
      double length;         // 長(zhǎng)度
      double breadth;        // 寬度
      double height;         // 高度
      double getVolume(void);// 返回體積
};

成員函數(shù)可以定義在類(lèi)定義內(nèi)部,或者單獨(dú)使用范圍解析運(yùn)算符 :: 來(lái)定義。在類(lèi)定義中定義的成員函數(shù)把函數(shù)聲明為內(nèi)聯(lián)的,即便沒(méi)有使用 inline 標(biāo)識(shí)符。所以您可以按照如下方式定義 getVolume() 函數(shù):

class Box
{
   public:
      double length;      // 長(zhǎng)度
      double breadth;     // 寬度
      double height;      // 高度
   
      double getVolume(void)
      {
         return length * breadth * height;
      }
};

您也可以在類(lèi)的外部使用范圍解析運(yùn)算符 :: 定義該函數(shù),如下所示:

double Box::getVolume(void)
{
    return length * breadth * height;
}

在這里,需要強(qiáng)調(diào)一點(diǎn),在 :: 運(yùn)算符之前必須使用類(lèi)名。調(diào)用成員函數(shù)是在對(duì)象上使用點(diǎn)運(yùn)算符(.),這樣它就能操作與該對(duì)象相關(guān)的數(shù)據(jù)。

這里需要注意的是,定義在類(lèi)中的成員函數(shù)缺省都是內(nèi)聯(lián)的,如果在類(lèi)定義時(shí)就在類(lèi)內(nèi)給出函數(shù)定義,那當(dāng)然最好。如果在類(lèi)中未給出成員函數(shù)定義,而又想內(nèi)聯(lián)該函數(shù)的話(huà),那在類(lèi)外要加上 inline,否則就認(rèn)為不是內(nèi)聯(lián)的。例如:

class A
{
    public:void Foo(int x, int y) {  } // 自動(dòng)地成為內(nèi)聯(lián)函數(shù)
}

將成員函數(shù)的定義體放在類(lèi)聲明之中雖然能帶來(lái)書(shū)寫(xiě)上的方便,但不是一種良好的編程風(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)在我們來(lái)梳理一下上面所說(shuō)的程序,如下所示

#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,類(lèi)型為 Box
   Box Box2;                // 聲明 Box2,類(lèi)型為 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é)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 淺析C語(yǔ)言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別

    淺析C語(yǔ)言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別

    以下是對(duì)C語(yǔ)言中printf(),sprintf(),scanf(),sscanf()的用法以及區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++排序算法之插入排序解析

    C++排序算法之插入排序解析

    這篇文章主要介紹了C++排序算法之插入排序解析,將數(shù)組分為有序表和無(wú)序表,每次從有序表中取出一個(gè)元素,插入到有序表的適當(dāng)位置,每遍歷一次,有序表中元素增加一個(gè),無(wú)序表中元素個(gè)數(shù)減少一個(gè),重復(fù)n-1次,完成排序,需要的朋友可以參考下
    2023-10-10
  • C++中使用mutable關(guān)鍵字的場(chǎng)景分析

    C++中使用mutable關(guān)鍵字的場(chǎng)景分析

    C++中的mutable關(guān)鍵字用于修飾類(lèi)的成員變量,使其在const成員函數(shù)中可以被修改,它主要用于緩存、線(xiàn)程同步和調(diào)試等場(chǎng)景,以支持對(duì)象的邏輯常量性,在使用mutable時(shí),應(yīng)確保其修改不會(huì)破壞對(duì)象的外部表現(xiàn)狀態(tài),本文介紹C++中使用mutable關(guān)鍵字的場(chǎng)景分析,感興趣的朋友一起看看吧
    2025-02-02
  • C語(yǔ)言volatile關(guān)鍵字的作用與示例

    C語(yǔ)言volatile關(guān)鍵字的作用與示例

    這篇文章主要介紹了C語(yǔ)言volatile關(guān)鍵字的作用,volatile提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲(chǔ)或讀取這個(gè)變量的時(shí)候,都會(huì)直接從變量地址中讀取數(shù)據(jù)
    2023-04-04
  • C++重載運(yùn)算符的規(guī)則詳解

    C++重載運(yùn)算符的規(guī)則詳解

    運(yùn)算符重載函數(shù)可以是類(lèi)的成員函數(shù),也可以是類(lèi)的友元函數(shù),還可以是既非類(lèi)的成員函數(shù)也不是友元函數(shù)的普通函數(shù)
    2013-10-10
  • OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理

    OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 總結(jié)c++性能優(yōu)化策略

    總結(jié)c++性能優(yōu)化策略

    在本篇文章中小編給大家總結(jié)了關(guān)于C++的性能優(yōu)化策略的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • C++實(shí)現(xiàn)單例模式的方法

    C++實(shí)現(xiàn)單例模式的方法

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)單例模式的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++STL之string類(lèi)的使用

    C++STL之string類(lèi)的使用

    這篇文章主要為大家詳細(xì)介紹了C++STL中的string類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C語(yǔ)言入門(mén)學(xué)習(xí)之fgets()函數(shù)和fputs()函數(shù)

    C語(yǔ)言入門(mén)學(xué)習(xí)之fgets()函數(shù)和fputs()函數(shù)

    fgetc() 和 fputc() 函數(shù)每次只能讀寫(xiě)一個(gè)字符,速度較慢,實(shí)際開(kāi)發(fā)中往往是每次讀寫(xiě)一個(gè)字符串或者一個(gè)數(shù)據(jù)塊,這樣能明顯提高效率,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言入門(mén)學(xué)習(xí)之fgets()函數(shù)和fputs()函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

牙克石市| 略阳县| 黑山县| 福安市| 吉隆县| 睢宁县| 黎平县| 旺苍县| 澄迈县| 昆明市| 鄂尔多斯市| 桦南县| 双桥区| 商丘市| 大埔县| 禹州市| 尉氏县| 阳高县| 梁平县| 晋江市| 怀安县| 荣昌县| 乌拉特前旗| 宁陵县| 平南县| 阿瓦提县| 天峻县| 盈江县| 台江县| 丰原市| 普兰县| 大荔县| 和林格尔县| 宜章县| 芒康县| 竹溪县| 古交市| 洪雅县| 汝阳县| 临洮县| 涪陵区|