日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++類和對象概念及實現(xiàn)詳解(上篇)-創(chuàng)新互聯(lián)

文章目錄

公司主營業(yè)務(wù):網(wǎng)站制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出彌勒免費做網(wǎng)站回饋大家。

一、什么是類和對象呢?

1、類的引入

2、類的定義

3、類的訪問限定符

4、類對象的儲存方式

5、this指針的特性

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

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

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

3、未完待續(xù)……?


標(biāo)題:類和對象概念及實現(xiàn)詳解(上篇) 作者:@Ggggggtm 寄語:與其忙著訴苦,不如低頭趕路,奮路前行,終將遇到一番好風(fēng)景

一、什么是類和對象呢? 1、類的引入
? C 語言結(jié)構(gòu)體中只能定義變量,在 C++ 中,結(jié)構(gòu)體內(nèi)不僅可以定義變量,也可以定義函數(shù)。 比如: 之前在數(shù)據(jù)結(jié)構(gòu)初階中,用C 語言方式實現(xiàn)的棧,結(jié)構(gòu)體中只能定義變量 ;現(xiàn)在以 C++ 方式實現(xiàn), 會發(fā)現(xiàn) struct 中也可以定義函數(shù)。
2、類的定義
class className
{
// 類體:由成員函數(shù)和成員變量組成
}; ?// 一定要注意后面的分號

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

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

?類的兩種定義方式:

  1. 聲明和定義全部放在類體中,需注意:成員函數(shù)如果 在類中定義 ,編譯器可能會將其當(dāng)成 內(nèi) 聯(lián)函數(shù) 處理。
  2. 類聲明放在 .h 文件中,成員函數(shù)定義放在 .cpp 文件中,注意: 成員函數(shù)名前需要加類名 ::。?
3、類的訪問限定符

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

訪問限定符說明:

  1. public修飾的成員在類外可以直接被訪問;
  2. protected和private修飾的成員在類外不能直接被訪問;
  3. 訪問權(quán)限作用域從該訪問限定符出現(xiàn)的位置開始直到下一個訪問限定符出現(xiàn)時為止;
  4. 如果后面沒有訪問限定符,作用域就到 } 即類結(jié)束;
  5. class的默認(rèn)訪問權(quán)限為private,struct為public(因為struct要兼容C)?。
4、類對象的儲存方式

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

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

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<

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

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

this指針的特性:

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

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

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

? 如果一個類中什么成員都沒有,簡稱為空類。 空類中真的什么都沒有嗎?并不是,任何類在什么都不寫時,編譯器會自動生成以下6 個默認(rèn)成員函數(shù):
  1. 構(gòu)造函數(shù);
  2. 析構(gòu)函數(shù);
  3. 拷貝構(gòu)造;
  4. 賦值重載;
  5. 普通對象取地址;
  6. const對象取地址。

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

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

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

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

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

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

class Date
 {
 ?public:
 ? ? ?// 1.無參構(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)用無參構(gòu)造函數(shù)
 ? ? ?Date d2(2015, 1, 1); // 調(diào)用帶參的構(gòu)造函數(shù)
 ?
 ? ? ?// 注意:如果通過無參構(gòu)造函數(shù)創(chuàng)建對象時,對象后面不用跟括號,否則就成了函數(shù)聲明
 ? ? ?// 以下代碼的函數(shù):聲明了d3函數(shù),該函數(shù)無參,返回一個日期類型的對象
 ? ? ?// warning C4930: “Date d3(void)”: 未調(diào)用原型函數(shù)(是否是有意用變量定義的?)
 ? ? ?Date d3();
 }
? 關(guān)于編譯器生成的默認(rèn)成員函數(shù),很多人都會有疑惑:不實現(xiàn)構(gòu)造函數(shù)的情況下,編譯器會 生成默認(rèn)的構(gòu)造函數(shù)。但是看起來默認(rèn)構(gòu)造函數(shù)又沒什么用? 象調(diào)用了編譯器生成的默 認(rèn)構(gòu)造函數(shù),但是 對象中的成員函數(shù) 依舊是隨機值。也就說在這里 編譯器生成的 默認(rèn)構(gòu)造函數(shù)并沒有什么用?? ? C++ 把類型分成內(nèi)置類型 ( 基本類型 ) 和自定義類型。內(nèi)置類型就是語言提供的數(shù)據(jù)類 型,如: int/char... ,自定義類型就是我們使用 class/struct/union等自己定義的類型。其實編譯器生成默認(rèn)的構(gòu)造函數(shù)會對自定類型成員 調(diào)用的它的默認(rèn)成員函數(shù),并不會對內(nèi)置類型的成員變量進行初始化。? ? 如下面代碼:Data中并沒有自己實現(xiàn)構(gòu)造函數(shù),系統(tǒng)會自動生成。讓后會對自定義類型成員_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:
     // 基本類型(內(nèi)置類型)
     int _year;
     int _month;
     int _day;
     // 自定義類型
     Time _t;
};
int main()
{
     Date d;
     return 0; 
}
? 無參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個。 注意:無參構(gòu)造函數(shù)、全缺省構(gòu)造函數(shù)、我們沒寫編譯器默認(rèn)生成的構(gòu)造函數(shù),都可以認(rèn)為 是默認(rèn)構(gòu)造函數(shù)。
2、析構(gòu)函數(shù)
? 通過前面構(gòu)造函數(shù)的學(xué)習(xí),我們知道一個對象是怎么來的,那一個對象又是怎么沒呢的?這里就用到了析構(gòu)函數(shù)。 ? 析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對對象本身的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時會自動調(diào)用析構(gòu)函數(shù),完成對象中資源的清理工作。
析構(gòu)函數(shù) 是特殊的成員函數(shù),其 特征 如下:
  • 析構(gòu)函數(shù)名是在類名前加上字符 ~。
  • 無參數(shù)無返回值類型;
  • 一個類只能有一個析構(gòu)函數(shù)。若未顯式定義,系統(tǒng)會自動生成默認(rèn)的析構(gòu)函數(shù)。注意:析構(gòu)函數(shù)不能重載;
  • 對象生命周期結(jié)束時, C++ 編譯系統(tǒng)系統(tǒ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申請空間失敗!!!");
         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)于編譯器自動生成的析構(gòu)函數(shù),是否會完成一些事情呢?編譯器生成的默認(rèn)析構(gòu)函數(shù),對自定類型成員調(diào)用它的析構(gòu)函數(shù)。 注意:創(chuàng)建那個類的對象則調(diào)用該類的析構(gòu)函數(shù),銷毀哪個類的對象則調(diào)用該類的析構(gòu)函數(shù)。 ? 如果類中沒有申請資源時,析構(gòu)函數(shù)可以不寫,直接使用編譯器生成的默認(rèn)析構(gòu)函數(shù), 有資源申請時,一定要寫,否則會造成資源泄漏。
3、未完待續(xù)……?

今天的內(nèi)容就到這里,需要重點理解和掌握構(gòu)造函數(shù)和析構(gòu)函數(shù),后續(xù)我會更新下篇帶大家理解完類和對象ovo!

希望以上內(nèi)容對你有所幫助,感謝閱讀。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站欄目:C++類和對象概念及實現(xiàn)詳解(上篇)-創(chuàng)新互聯(lián)
鏈接地址:http://www.dlmjj.cn/article/diehoh.html