欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++類(lèi)與對(duì)象的基礎(chǔ)知識(shí)點(diǎn)詳細(xì)分析

 更新時(shí)間:2023年02月13日 10:47:40   作者:Ggggggtm  
類(lèi)和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域

一、什么是類(lèi)和對(duì)象呢

1、類(lèi)的引入

C 語(yǔ)言結(jié)構(gòu)體中只能定義變量,在 C++ 中,結(jié)構(gòu)體內(nèi)不僅可以定義變量,也可以定義函數(shù)。 比如: 之前在數(shù)據(jù)結(jié)構(gòu)初階中,用C 語(yǔ)言方式實(shí)現(xiàn)的棧,結(jié)構(gòu)體中只能定義變量 ;現(xiàn)在以 C++ 方式實(shí)現(xiàn), 會(huì)發(fā)現(xiàn) struct 中也可以定義函數(shù)。

2、類(lèi)的定義

class className
{
// 類(lèi)體:由成員函數(shù)和成員變量組成
};  // 一定要注意后面的分號(hào)

class為定義類(lèi)的關(guān)鍵字,ClassName為類(lèi)的名字,{}中為類(lèi)的主體,注意類(lèi)定義結(jié)束時(shí)后面分號(hào)不能省略。

類(lèi)體中內(nèi)容稱為 類(lèi)的成員: 類(lèi)中的 變量 稱為 類(lèi)的屬性 或 成員變量 ; 類(lèi)中的 函數(shù) 稱為 類(lèi)的方法 或者 成員函數(shù) 。

類(lèi)的兩種定義方式:

聲明和定義全部放在類(lèi)體中,需注意:成員函數(shù)如果 在類(lèi)中定義 ,編譯器可能會(huì)將其當(dāng)成 內(nèi) 聯(lián)函數(shù) 處理。

類(lèi)聲明放在 .h 文件中,成員函數(shù)定義放在 .cpp 文件中,注意: 成員函數(shù)名前需要加類(lèi)名 ::。

3、類(lèi)的訪問(wèn)限定符

C++實(shí)現(xiàn)封裝的方式:用類(lèi)將對(duì)象的屬性與方法結(jié)合在一塊,讓對(duì)象更加完善,通過(guò)訪問(wèn)權(quán)限選擇性的將其接口提供給外部的用戶使用。

訪問(wèn)限定符說(shuō)明:

  • public修飾的成員在類(lèi)外可以直接被訪問(wèn);
  • protected和private修飾的成員在類(lèi)外不能直接被訪問(wèn);
  • 訪問(wèn)權(quán)限作用域從該訪問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪問(wèn)限定符出現(xiàn)時(shí)為止;
  • 如果后面沒(méi)有訪問(wèn)限定符,作用域就到 } 即類(lèi)結(jié)束;
  • class的默認(rèn)訪問(wèn)權(quán)限為private,struct為public(因?yàn)閟truct要兼容C) 。

4、類(lèi)對(duì)象的儲(chǔ)存方式

我們假想:每個(gè)對(duì)象中成員變量是不同的,但是調(diào)用同一份成員函數(shù),如果按照每實(shí)例一個(gè)對(duì)象都給成員變量和成員函數(shù)創(chuàng)造一次空間存儲(chǔ),當(dāng)一 個(gè)類(lèi)創(chuàng)建多個(gè)對(duì)象時(shí),每個(gè)對(duì)象中都會(huì)保存一份代碼,相同代碼保存多次,浪費(fèi)空間。那么如何解決呢?

針對(duì)上面的問(wèn)題,類(lèi)的存儲(chǔ)就變成了:只保存成員變量,成員函數(shù)存放在公共的代碼段 。那么一個(gè)類(lèi)的大小其實(shí)就是:實(shí)際就是該類(lèi)中”成員變量”之和,當(dāng)然要注意內(nèi)存對(duì)齊,注意空類(lèi)的大小,空類(lèi)比較特殊,編譯器給了空類(lèi)一個(gè)字節(jié)來(lái)唯一標(biāo)識(shí)這個(gè)類(lèi)的對(duì)象。

5、this指針的特性

class Date
{ 
public:
 void Init(int year, int month, int day)
 {
     _year = year;
     _month = month;
     _day = day;
 }
 void Print()
 {
     cout <<_year<< "-" <<_month << "-"<< _day <<endl;
 }
private:
     int _year;     // 年
     int _month;    // 月
     int _day;      // 日
};
int main()
{
     Date d1, d2;
     d1.Init(2022,1,11);
     d2.Init(2022, 1, 12);
     d1.Print();
     d2.Print();
     return 0; 
}

我們知道了成員函數(shù)是放在了公共代碼段。函數(shù)體中沒(méi)有關(guān)于不同對(duì)象的區(qū)分。那么在上面的代碼中d1和d2同時(shí)掉用了Print()函數(shù),怎么是分別打印出d1對(duì)象中的成員變量和d2對(duì)象中的成員變量呢?(當(dāng)然Init函數(shù)與Print函數(shù)的區(qū)分類(lèi)似)。

C++ 中通過(guò)引入 this 指針解決該問(wèn)題,即: C++ 編譯器給每個(gè) “ 非靜態(tài)的成員函數(shù) “ 增加了一個(gè)隱藏 的指針參數(shù),讓該指針指向當(dāng)前對(duì)象 ( 函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象 ) ,在函數(shù)體中所有 “ 成員變量 ” 的操作,都是通過(guò)該指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶是透明的,即用戶不需要來(lái)傳遞,編 譯器自動(dòng)完成 。如下圖:

this指針的特性:

  • this 指針的類(lèi)型:類(lèi)類(lèi)型 * const ,即成員函數(shù)中,不能給 this 指針賦值;
  • this 指針是 “ 成員函數(shù) ” 第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò) ecx 寄存器自動(dòng)傳遞,不需要用戶傳遞;
  • this 指針本質(zhì)上是 “ 成員函數(shù) ” 的形參 ,當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this形參。所以 對(duì)象中不存儲(chǔ) this 指針;
  • 只能在 “ 成員函數(shù) ” 的內(nèi)部使用。

二、類(lèi)的六個(gè)默認(rèn)成員函數(shù)詳解

什么是默認(rèn)成員函數(shù)呢?

默認(rèn)成員函數(shù):用戶沒(méi)有顯式實(shí)現(xiàn),編譯器會(huì)生成的成員函數(shù)稱為默認(rèn)成員函數(shù)。

如果一個(gè)類(lèi)中什么成員都沒(méi)有,簡(jiǎn)稱為空類(lèi)。 空類(lèi)中真的什么都沒(méi)有嗎?并不是,任何類(lèi)在什么都不寫(xiě)時(shí),編譯器會(huì)自動(dòng)生成以下6 個(gè)默認(rèn)成員函數(shù): 

  • 構(gòu)造函數(shù);
  • 析構(gòu)函數(shù);
  • 拷貝構(gòu)造;
  • 賦值重載;
  • 普通對(duì)象取地址;
  • const對(duì)象取地址。

我們來(lái)看一下各個(gè)默認(rèn)的成員函數(shù)的概念及實(shí)現(xiàn)。本篇我們先掌握構(gòu)造函數(shù)和析構(gòu)函數(shù),這兩個(gè)時(shí)相對(duì)較為麻煩和重要的,下篇我們會(huì)接著是西安剩余的默認(rèn)成員函數(shù)以及類(lèi)和對(duì)象剩余的重要的部分。

1、構(gòu)造函數(shù)

構(gòu)造函數(shù)是一個(gè)特殊的成員函數(shù),名字與類(lèi)名相同,創(chuàng)建類(lèi)類(lèi)型對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,以保證每個(gè)數(shù)據(jù)成員都有 一個(gè)合適的初始值,并且在對(duì)象整個(gè)生命周期內(nèi)只調(diào)用一次。

構(gòu)造函數(shù)是特殊的成員函數(shù),需要注意的是,構(gòu)造函數(shù)雖然名稱叫構(gòu)造,但是構(gòu)造函數(shù)的主要任務(wù)并不是開(kāi)空間創(chuàng)建對(duì)象,而是初始化對(duì)象。其特征如下:

  • 函數(shù)名與類(lèi)名相同;
  • 無(wú)返回值;
  • 對(duì)象實(shí)例化時(shí)自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù);
  • 構(gòu)造函數(shù)可以重載。
  • 如果如果類(lèi)中沒(méi)有顯式定義構(gòu)造函數(shù),則C++編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的無(wú)參構(gòu)造函數(shù),一但用戶顯式定義編譯器將不再生成。

我們結(jié)合著以下代碼一起理解以下。

  class Date
 {
  public:
      // 1.無(wú)參構(gòu)造函數(shù)
      Date()
     {}
      // 2.帶參構(gòu)造函數(shù)
      Date(int year, int month, int day)
     {
          _year = year;
          _month = month;
          _day = day;
     }
  private:
      int _year;
      int _month;
      int _day;
 };
  void TestDate()
 {
      Date d1; // 調(diào)用無(wú)參構(gòu)造函數(shù)
      Date d2(2015, 1, 1); // 調(diào)用帶參的構(gòu)造函數(shù)
      // 注意:如果通過(guò)無(wú)參構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),對(duì)象后面不用跟括號(hào),否則就成了函數(shù)聲明
      // 以下代碼的函數(shù):聲明了d3函數(shù),該函數(shù)無(wú)參,返回一個(gè)日期類(lèi)型的對(duì)象
      // warning C4930: “Date d3(void)”: 未調(diào)用原型函數(shù)(是否是有意用變量定義的?)
      Date d3();
 }

關(guān)于編譯器生成的默認(rèn)成員函數(shù),很多人都會(huì)有疑惑:不實(shí)現(xiàn)構(gòu)造函數(shù)的情況下,編譯器會(huì) 生成默認(rèn)的構(gòu)造函數(shù)。但是看起來(lái)默認(rèn)構(gòu)造函數(shù)又沒(méi)什么用? 象調(diào)用了編譯器生成的默 認(rèn)構(gòu)造函數(shù),但是 對(duì)象中的成員函數(shù) 依舊是隨機(jī)值。也就說(shuō)在這里 編譯器生成的 默認(rèn)構(gòu)造函數(shù)并沒(méi)有什么用??

C++ 把類(lèi)型分成內(nèi)置類(lèi)型 ( 基本類(lèi)型 ) 和自定義類(lèi)型。內(nèi)置類(lèi)型就是語(yǔ)言提供的數(shù)據(jù)類(lèi) 型,如: int/char... ,自定義類(lèi)型就是我們使用 class/struct/union等自己定義的類(lèi)型。其實(shí)編譯器生成默認(rèn)的構(gòu)造函數(shù)會(huì)對(duì)自定類(lèi)型成員 調(diào)用的它的默認(rèn)成員函數(shù),并不會(huì)對(duì)內(nèi)置類(lèi)型的成員變量進(jìn)行初始化。

如下面代碼:Data中并沒(méi)有自己實(shí)現(xiàn)構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成。讓后會(huì)對(duì)自定義類(lèi)型成員_t調(diào)用它的默認(rèn)成員函數(shù)。

class Time
{
public:
 Time()
 {
     cout << "Time()" << endl;
     _hour = 0;
     _minute = 0;
     _second = 0;
 }
private:
     int _hour;
     int _minute;
     int _second;
};
class Date
{
private:
     // 基本類(lèi)型(內(nèi)置類(lèi)型)
     int _year;
     int _month;
     int _day;
     // 自定義類(lèi)型
     Time _t;
};
int main()
{
     Date d;
     return 0; 
}

無(wú)參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個(gè)。 注意:無(wú)參構(gòu)造函數(shù)、全缺省構(gòu)造函數(shù)、我們沒(méi)寫(xiě)編譯器默認(rèn)生成的構(gòu)造函數(shù),都可以認(rèn)為 是默認(rèn)構(gòu)造函數(shù)。

2、析構(gòu)函數(shù)

通過(guò)前面構(gòu)造函數(shù)的學(xué)習(xí),我們知道一個(gè)對(duì)象是怎么來(lái)的,那一個(gè)對(duì)象又是怎么沒(méi)呢的?這里就用到了析構(gòu)函數(shù)。 析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對(duì)對(duì)象本身的銷(xiāo)毀,局部對(duì)象銷(xiāo)毀工作是由編譯器完成的。而對(duì)象在銷(xiāo)毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成對(duì)象中資源的清理工作。

析構(gòu)函數(shù) 是特殊的成員函數(shù),其特征如下:

  • 析構(gòu)函數(shù)名是在類(lèi)名前加上字符 ~。
  • 無(wú)參數(shù)無(wú)返回值類(lèi)型;
  • 一個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù)。若未顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。注意:析構(gòu)函數(shù)不能重載;
  • 對(duì)象生命周期結(jié)束時(shí), C++ 編譯系統(tǒng)系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)。

我們結(jié)合下面代碼一起理解一下。

typedef int DataType;
class Stack
{
public:
 Stack(size_t capacity = 3)
 {
     _array = (DataType*)malloc(sizeof(DataType) * capacity);
     if (NULL == _array)
     {
         perror("malloc申請(qǐng)空間失敗!!!");
         return;
     }
     _capacity = capacity;
     _size = 0;
}
void Push(DataType data)
{
     //CheckCapacity();
     _array[_size] = data;
     _size++;
}
 // 其他方法...
 ~Stack()
 {
     if (_array)
     {
         free(_array);
         _array = NULL;
         _capacity = 0;
         _size = 0;
     }
}
private:
     DataType* _array;
     int _capacity;
     int _size;
};
void TestStack()
{
     Stack s;
     s.Push(1);
     s.Push(2);
}

關(guān)于編譯器自動(dòng)生成的析構(gòu)函數(shù),是否會(huì)完成一些事情呢?編譯器生成的默認(rèn)析構(gòu)函數(shù),對(duì)自定類(lèi)型成員調(diào)用它的析構(gòu)函數(shù)。 注意:創(chuàng)建那個(gè)類(lèi)的對(duì)象則調(diào)用該類(lèi)的析構(gòu)函數(shù),銷(xiāo)毀哪個(gè)類(lèi)的對(duì)象則調(diào)用該類(lèi)的析構(gòu)函數(shù)。 如果類(lèi)中沒(méi)有申請(qǐng)資源時(shí),析構(gòu)函數(shù)可以不寫(xiě),直接使用編譯器生成的默認(rèn)析構(gòu)函數(shù), 有資源申請(qǐng)時(shí),一定要寫(xiě),否則會(huì)造成資源泄漏。 今天的內(nèi)容就到這里,需要重點(diǎn)理解和掌握構(gòu)造函數(shù)和析構(gòu)函數(shù),后續(xù)我會(huì)更新下篇帶大家理解完類(lèi)和對(duì)象ovo!

到此這篇關(guān)于C++類(lèi)與對(duì)象的知識(shí)點(diǎn)詳細(xì)分析的文章就介紹到這了,更多相關(guān)C++類(lèi)與對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言單鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    C語(yǔ)言單鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言單鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語(yǔ)言軟件spi虛擬總線中間層設(shè)計(jì)詳解

    C語(yǔ)言軟件spi虛擬總線中間層設(shè)計(jì)詳解

    這篇文章主要為大家介紹了C語(yǔ)言軟件spi虛擬總線中間層設(shè)計(jì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C語(yǔ)言實(shí)現(xiàn)繪制余弦曲線

    C語(yǔ)言實(shí)現(xiàn)繪制余弦曲線

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)繪制余弦曲線的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • c++ 解析yaml文件的步驟

    c++ 解析yaml文件的步驟

    這篇文章主要介紹了c++ 解析yaml文件的步驟,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-12-12
  • c++優(yōu)先隊(duì)列(priority_queue)用法詳解

    c++優(yōu)先隊(duì)列(priority_queue)用法詳解

    這篇文章主要介紹了c++優(yōu)先隊(duì)列(priority_queue)用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C++中產(chǎn)生臨時(shí)對(duì)象的情況及其解決方案

    C++中產(chǎn)生臨時(shí)對(duì)象的情況及其解決方案

    這篇文章主要介紹了C++中產(chǎn)生臨時(shí)對(duì)象的情況及其解決方案,以值傳遞的方式給函數(shù)傳參,類(lèi)型轉(zhuǎn)換以及函數(shù)需要返回對(duì)象時(shí),并給對(duì)應(yīng)給出了詳細(xì)的解決方案,通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(文件操作)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(文件操作)

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),增加了文件操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++使用curl庫(kù)進(jìn)行http請(qǐng)求的方法詳解

    C++使用curl庫(kù)進(jìn)行http請(qǐng)求的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C++如何使用curl庫(kù)進(jìn)行http請(qǐng)求,并且實(shí)現(xiàn)獲取返回的頭信息的時(shí)間,也就是獲取后臺(tái)服務(wù)的當(dāng)前時(shí)間,感興趣的可以了解一下
    2023-07-07
  • C++11中強(qiáng)類(lèi)型枚舉的使用

    C++11中強(qiáng)類(lèi)型枚舉的使用

    本文主要介紹了C++11中強(qiáng)類(lèi)型枚舉的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C#使用反射加載多個(gè)程序集的實(shí)現(xiàn)方法

    C#使用反射加載多個(gè)程序集的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇C#使用反射加載多個(gè)程序集的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06

最新評(píng)論