類的定義

類的定義

6. 類定義的語(yǔ)法格式

  • 在定義數(shù)據(jù)成員時(shí)不能直接進(jìn)行初始化级野,要為數(shù)據(jù)成員提供初始值應(yīng)該放在構(gòu)造函數(shù)中。
  • 類定義的末尾應(yīng)添加分號(hào)颓哮。

7. C++ 中類成員訪問權(quán)限有哪幾種袭异,簡(jiǎn)述其作用对省?

  • private:類中的 private 成員只能夠在本類中或者友元類中進(jìn)行訪問。子
    類或者外界是無(wú)法訪問私有成員的口渔。
  • protected:類中的 protected 成員只允許本類或者子類中進(jìn)行訪問样屠。外界
    無(wú)法訪問 protected 成員。在定義類時(shí)缺脉,如果希望該成員能夠被子類繼承痪欲,但是不被外界訪問,可以定義 protected 成員攻礼。
  • public:類中的 public 成員能夠在本類业踢、子類和外界中都能夠進(jìn)行訪問。
    通常礁扮,類中向用戶提供的服務(wù)設(shè)計(jì)為 public 成員知举。

8. 如何在類中定義常量成員并為其初始化?

要為常量初始化太伊,需要在類的構(gòu)造函數(shù)的初始化部分進(jìn)行雇锡,也就是在構(gòu)
造函數(shù)的函數(shù)體前使用 “:” 定義初始化區(qū)域,在該區(qū)域進(jìn)行初始化僚焦。

class CBook
{
public:
    const double m_Price; //定義常量成員
    CBook() :m_Price(89.8) //為常量進(jìn)行初始化
    {
    }
};

9. 由析構(gòu)函數(shù)引起的遞歸調(diào)用

析構(gòu)函數(shù)由系統(tǒng)自動(dòng)調(diào)用锰提。有兩種情況將導(dǎo)致析構(gòu)函數(shù)被調(diào)用。一是對(duì)
象的作用域消失芳悲,二是使用 delete 運(yùn)算符釋放對(duì)象立肘。

class CNode
{
public:
    CNode* pNext;
    CNode() //構(gòu)造函數(shù)
    {
        pNext = this;
    }
    ~CNode() //析構(gòu)函數(shù)
    {
        if(pNext!=NULL)
        {
            delete pNext;
            pNext = NULL;
        }
    }
};

上面代碼出現(xiàn)了遞歸調(diào)用。在析構(gòu)函數(shù)中執(zhí)行 “delete pNext;” 語(yǔ)句時(shí)導(dǎo)致遞歸芭概。因?yàn)樵谖鰳?gòu)函數(shù)中使用 delete 運(yùn)算符釋放自身赛不,這將導(dǎo)致再次調(diào)用析構(gòu)函數(shù)惩嘉,致使析構(gòu)函數(shù)出現(xiàn)遞歸罢洲。

10. 在 C++ 中如何定義內(nèi)聯(lián)成員函數(shù)

  • 在定義成員函數(shù)時(shí)使用inline 關(guān)鍵字。
class CBook
{
private:
      double m_Price;
public:
      inline void SetPrice(double Price); //使用 inline 關(guān)鍵字定義內(nèi)聯(lián)函數(shù)
      CBook()
      {
      }
};
void CBook::SetPrice(double Price)
{
      m_Price = Price;
}
  • 在定義成員函數(shù)時(shí)直接寫出函數(shù)體文黎。
class CBook
{
private:
      double m_Price;
public:
      void SetPrice(double Price) //在定義成員函數(shù)時(shí)直接給出函數(shù)體惹苗,自動(dòng)為內(nèi)聯(lián)函數(shù)
      {
           m_Price = Price;
      }
      CBook()
      {
      }
};

11. 構(gòu)造函數(shù)與普通函數(shù)在形式上有何不同?

  • 名字與類相同耸峭,無(wú)返回值
  • 無(wú)參數(shù)桩蓉,或若干參數(shù),無(wú)參數(shù)的構(gòu)造函數(shù)叫默認(rèn)構(gòu)造函數(shù)劳闹;如果不提供構(gòu)造函數(shù)院究,則編譯器提供默認(rèn)構(gòu)造函數(shù)洽瞬,如提供了任何形式的構(gòu)造函數(shù),編譯器不會(huì)提供默認(rèn)構(gòu)造函數(shù)

12. 如何定義兩個(gè)類互為成員的情況业汰?

classA
{
private:
    B m_B;
};
class B
{
private:
    Am_A;
};

不用進(jìn)行編譯伙窃,就可以預(yù)知存在錯(cuò)誤。因?yàn)樵陬?A 之前样漆,沒有發(fā)現(xiàn)類 B 的定義为障,直接使用了類 B。為了解決這個(gè)矛盾放祟,需要在類 A 上方前導(dǎo)聲明類 B鳍怨。但是這還不能完全解決問題。因?yàn)榍皩?dǎo)聲明只是聲明一個(gè)類跪妥,而沒有類的定義鞋喇,編譯器在編譯類 A 時(shí)需要實(shí)例化類 B,但是卻沒有發(fā)現(xiàn)類 B 的定義骗奖,而只是發(fā)現(xiàn)了類 B 的聲明确徙。解決方式是在類 A 中,將 m_B 對(duì)象修改為指針類型执桌。

class B; //前導(dǎo)聲明類 B
classA
{
private:
    B *m_B; //定義類 B 的指針類型
};
class B
{
private:
    Am_A;
};

13. 已知 String 類的定義鄙皇, 請(qǐng)?zhí)砑訉?shí)現(xiàn)部分。

class String
{
public:
    String(const char *str = NULL); //通用構(gòu)造函數(shù)
    String(const String &another); //拷貝構(gòu)造函數(shù)
    ~ String(); //析構(gòu)函數(shù)
    String &operator =(const String &rhs); //賦值函數(shù)
private:
    char *m_data; //用于保存字符串
};

在定義一個(gè)類時(shí)如果沒有指定這些函數(shù)仰挣,編譯器會(huì)為其提供這 4 個(gè)特殊的函數(shù)伴逸。除了構(gòu)造函數(shù)之外,其余 3 個(gè)函數(shù)都具有特定的函數(shù)原型膘壶。例如错蝴,析構(gòu)函數(shù)的名稱為 “~” 加上類名,沒有參數(shù)和返回值颓芭∏昝蹋拷貝構(gòu)造函數(shù)與類名相同,參數(shù)為一個(gè)常量引用類型參數(shù)亡问。賦值函數(shù)參數(shù)為常量引用類型官紫,返回值為類引用類型。

構(gòu)造函數(shù)用于創(chuàng)建類對(duì)象州藕。析構(gòu)函數(shù)用于釋放對(duì)象束世。拷貝構(gòu)造函數(shù)用于
在類對(duì)象作為函數(shù)參數(shù)或函數(shù)返回值時(shí)被調(diào)用床玻,用于臨時(shí)構(gòu)建對(duì)象毁涉。賦值函數(shù)用于實(shí)現(xiàn)對(duì)象間的直接賦值。

參考代碼如下:

String::String(const char *str) //實(shí)現(xiàn)構(gòu)造函數(shù)
{
    if ( str == NULL ) //判斷參數(shù)是否為空
    {
        m_data = new char[1] ;
        m_data[0] = '\0' ;
    }
    else
    {
        m_data = new char[strlen(str) + 1];
        strcpy(m_data, str);
    }
}
String::String(const String &another) //實(shí)現(xiàn)拷貝構(gòu)造函數(shù)
{
    m_data = new char[strlen(another.m_data) + 1];
    strcpy(m_data, another.m_data);
}
String& String::operator =(const String &rhs) //實(shí)現(xiàn)賦值函數(shù)
{
    if ( this == &rhs)
        return *this ;
    delete []m_data; //刪除原來(lái)的數(shù)據(jù)锈死,新開一塊內(nèi)存
    m_data = new char[strlen(rhs.m_data) + 1];
    strcpy(m_data,rhs.m_data);
    return *this ;
}
String::~String() //實(shí)現(xiàn)析構(gòu)函數(shù)
{
    delete []m_data ;
}

14. 在定義類的成員函數(shù)時(shí)使用 mutable 關(guān)鍵字的作用是什么?

在定義類的方法時(shí)贫堰,如果在方法的末尾使用 const 關(guān)鍵字穆壕,表示該方法為 const 方法,此時(shí)在方法中不允許修改對(duì)象的信息其屏。例如粱檀,下面的代碼將出現(xiàn)編譯錯(cuò)誤。

class CStudent
{
private:
    intAge;
    int Weight;
public:
    void SetAge(intAge);
    int GetAge()const; //定義 const 方法
};
void CStudent::SetAge(intAge)
{
    this->Age =Age; //通過 this 指針來(lái)訪問成員 Age
}
int CStudent::GetAge()const
{
    Weight = 10; //此處將出現(xiàn)編譯錯(cuò)誤
    returnAge;
}

上述代碼在 const 方法中修改 Weight 成員導(dǎo)致的語(yǔ)法錯(cuò)誤漫玄。為了能夠在 const 方法中修改對(duì)象的成員信息茄蚯,可以在成員前使用 mutable 關(guān)鍵字。例如睦优,下面的代碼是完全合法的渗常。

class CStudent
{
private:
    intAge;
    mutable int Weight;
public:
    void SetAge(intAge);
    int GetAge() const ;
};
void CStudent::SetAge(intAge)
{
    this->Age =Age; //通過 this 指針來(lái)訪問成員 Age
}
int CStudent::GetAge() const //實(shí)現(xiàn) const 方法
{
    Weight = 10; //在 const 方法中為數(shù)據(jù)成員賦值
    return Age;
}

當(dāng)需要在 const 方法中修改對(duì)象的數(shù)據(jù)成員時(shí),可以在數(shù)據(jù)成員前使用 mutable 關(guān)鍵字汗盘,防止出現(xiàn)編譯錯(cuò)誤皱碘。

參考資料:
C++繼承權(quán)限和繼承方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隐孽,隨后出現(xiàn)的幾起案子癌椿,更是在濱河造成了極大的恐慌,老刑警劉巖菱阵,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踢俄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晴及,警方通過查閱死者的電腦和手機(jī)都办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)虑稼,“玉大人琳钉,你說(shuō)我怎么就攤上這事≈刖耄” “怎么了歌懒?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)溯壶。 經(jīng)常有香客問我及皂,道長(zhǎng),這世上最難降的妖魔是什么茸塞? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任躲庄,我火速辦了婚禮查剖,結(jié)果婚禮上钾虐,老公的妹妹穿的比我還像新娘。我一直安慰自己笋庄,他們只是感情好效扫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布倔监。 她就那樣靜靜地躺著,像睡著了一般菌仁。 火紅的嫁衣襯著肌膚如雪浩习。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天济丘,我揣著相機(jī)與錄音谱秽,去河邊找鬼。 笑死摹迷,一個(gè)胖子當(dāng)著我的面吹牛疟赊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峡碉,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼近哟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鲫寄?” 一聲冷哼從身側(cè)響起吉执,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎地来,沒想到半個(gè)月后戳玫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡未斑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年量九,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颂碧。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠列,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出载城,到底是詐尸還是另有隱情肌似,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布诉瓦,位于F島的核電站川队,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏睬澡。R本人自食惡果不足惜固额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煞聪。 院中可真熱鬧斗躏,春花似錦、人聲如沸昔脯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隧饼,卻和暖如春沈堡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燕雁。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工诞丽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拐格。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓率拒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親禁荒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猬膨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文博客園地址:http://www.cnblogs.com/xiongxuanwen/p/4290086.htm...
    先之閱讀 834評(píng)論 0 5
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out呛伴。 檢查...
    SeanC52111閱讀 2,764評(píng)論 0 3
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 一個(gè)博客勃痴,這個(gè)博客記錄了他讀這本書的筆記,總結(jié)得不錯(cuò)热康∨嫔辏《深度探索C++對(duì)象模型》筆記匯總 1. C++對(duì)象模型與內(nèi)...
    Mr希靈閱讀 5,571評(píng)論 0 13
  • 命令行執(zhí)行多行存儲(chǔ)過程DELIMITER //CREATE DEFINER=wxpaybase@% PROCEDU...
    ilkkzm閱讀 295評(píng)論 0 0