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

C++中的四個默認成員函數(shù)與運算符重載詳解

 更新時間:2017年08月04日 08:57:51   作者:Suhw  
這篇文章主要給大家介紹了關(guān)于C++中四個默認成員函數(shù)與運算符重載的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。

本文主要給大家介紹了關(guān)于C++默認成員函數(shù)與運算符重載的相關(guān)內(nèi)容,分享出來公的敬愛啊參考學(xué)習(xí),話不多說,來一起看看詳細的介紹:

一:類和對象的基礎(chǔ)知識:類的定義,訪問限定符,面向?qū)ο蠓庋b性,對象的大小計算等等。(編譯環(huán)境為VS2015)

面向?qū)ο蟪绦蛟O(shè)計:

概念:(Object Oriented Programming,縮寫:OOP)是一種程序設(shè)計范型,同時也是一種程序開發(fā)的方法。對象指的是類的實例,將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴展性。

類:類的基本思想是數(shù)據(jù)抽象和封裝。類的接口包括用戶所能執(zhí)行的操作;類的實現(xiàn)則包括類的數(shù)據(jù)成員、負責(zé)接口實現(xiàn)的函數(shù)體以及定義類所需的各種私有函數(shù)。要想實現(xiàn)數(shù)據(jù)抽線和封裝,就得先定義一個抽象數(shù)據(jù)類型。

訪問限定符:1.public(公有屬性);2.private(私有屬性,默認情況下就為此屬性);3.protect(保護)

注:

      1. public成員可從類外部直接訪問,private/protected成員不能從類外部直接訪問;

      2. 每個限定符在類體中可使用多次,它的作用域是從該限定符出現(xiàn)開始到下一個限定符之前或類體結(jié)束前。

      3. 類體中如果沒有定義限定符,則默認為私有的。

      4. 類的訪問限定符體現(xiàn)了面向?qū)ο蟮姆庋b性。

例:定義一個日期類

公有的成員函數(shù)可以在類內(nèi)聲明類外定義,也可以在類內(nèi)直接定義:

class Date
{
public:
 void Display(); //類內(nèi)聲明
private:
 int _year;
 int _month;
 int _day;
};

void Date::Display() //類外定義
{
 cout << _year << "-" << _month << "-" << _day << endl;
}

如何實例化一個對象?

class Date
{
public:
 void Display();

public:
 int _year;
 int _month;
 int _day;
};

int main()
{
 Date d1;
 d1._year = 2017;
 d1._month = 7;
 d1._day = 4;
 //Date d1;
 //Date *date = &d1;
 //date->_year = 2017;
 //date->_month = 7;
 //date->_day = 4;
 system("pause");
 return 0;
}

1.類只是一個模型一樣的東西,限定了類有哪些成員,定義出一個類并沒有分配實際的內(nèi)存空間來存儲它。

2.一個類可以實例化出多個對象,實例化出的對象占用實際的物理空間存儲類成員變量。

一個空類的大小是幾?

如果我們sizeof(Date),出來的結(jié)果是12;但是如果這個類是空類呢?結(jié)果是多少?

class AA {};

int main()
{
 int sz = sizeof(AA);
 cout << sz << endl;
 system("pause");
 return 0;
}

輸出結(jié)果是1!

原因是編譯器給空類分配了一個字節(jié)的大小用來占位。

注:結(jié)構(gòu)體內(nèi)存對其規(guī)則:

      1.第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處。

      2.其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。

      //對齊數(shù) = 編譯器默認的一個對齊數(shù) 與 該成員大小的較小值。

      VS中默認的值為8

      gcc中的默認值為4

      3.結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量除了第一個成員都有一個對齊數(shù))的整數(shù)倍。

      4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。

2:類的四個默認成員函數(shù)及運算符重載相關(guān)知識

構(gòu)造函數(shù):

成員變量為私有的,要對它們進行初始化,必須用一個公有成員函數(shù)來進行。同時這個函數(shù)應(yīng)該有且僅在定義對象時自動執(zhí)行一次,這時調(diào)用的函數(shù)稱為構(gòu)造函數(shù)(constructor) 。

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

      1. 函數(shù)名與類名相同。

      2. 無返回值。

      3. 對象構(gòu)造(對象實例化)時系統(tǒng)自動調(diào)用對應(yīng)的構(gòu)造函數(shù)。

      4. 構(gòu)造函數(shù)可以重載。

      5. 構(gòu)造函數(shù)可以在類中定義,也可以在類外定義。

      6. 如果類定義中沒有給出構(gòu)造函數(shù),則C++編譯器自動產(chǎn)生一個缺省的構(gòu)造函數(shù),但只要我們定義了一個構(gòu)造函數(shù),系統(tǒng)就不會自動生成缺省的構(gòu)造函數(shù)。

      7. 無參的構(gòu)造函數(shù)和全缺省值的構(gòu)造函數(shù)都認為是缺省構(gòu)造函數(shù),并且缺省的構(gòu)造函數(shù)只能有一個。

例:我們平時最常用的就是全缺省值的構(gòu)造函數(shù),定義方式如下:

 Date(int year = 1900, int month = 1, int day = 1)
 {
  _year = year;
  _month = month;
  _day = day;
 }
 //在main函數(shù)中按照下面方式進行初始化
 //若不進行賦值,則采用缺省值為1900-1-1
 Date d1(2017, 7, 6)

析構(gòu)函數(shù):

當(dāng)一個對象的生命周期結(jié)束時,C++編譯系統(tǒng)會自動調(diào)用一個成員函數(shù),這個特殊的成員函數(shù)即析構(gòu)函數(shù)(destructor)

其特征如下:

1. 析構(gòu)函數(shù)在類名加上字符~。

2. 析構(gòu)函數(shù)無參數(shù)無返回值。

3. 一個類有且只有一個析構(gòu)函數(shù)。若未顯示定義,系統(tǒng)會自動生成缺省的析構(gòu)函數(shù)。

4. 對象生命周期結(jié)束時,C++編譯系統(tǒng)系統(tǒng)自動調(diào)用析構(gòu)函數(shù)。

5. 注意析構(gòu)函數(shù)體內(nèi)并不是刪除對象,而是做一些清理工作。

就好比下面這個例子,構(gòu)造函數(shù)開辟了size個int類型大小的空間,在程序結(jié)束時我們就應(yīng)該釋放掉該內(nèi)存空間,避免發(fā)生內(nèi)存泄漏:

class Array
{
public:
 Array(int size)
 {
  _ptr = new int[size];
 }

 ~Array()
 {
  if (_ptr)
  {
   delete[] _ptr;
  }
 }
private:
 int* _ptr;
};

拷貝構(gòu)造

創(chuàng)建對象時使用同類對象來進行初始化,這時所用的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)(Copy Constructor),拷貝構(gòu)造函數(shù)是特殊的構(gòu)造函數(shù)。

例:

 Date(const Date& d)
 {
  _year = d._year;
  _month = d._month;
  _day = d._day;
 }

 //Date d1(2017, 7, 4);
 // 下面兩種用法都是調(diào)用拷貝構(gòu)造函數(shù),是等價的。
 //Date d2(d1); 
 //Date d2 = d1;

特征

      1. 拷貝構(gòu)造函數(shù)其實是一個構(gòu)造函數(shù)的重載。

      2. 拷貝構(gòu)造函數(shù)的參數(shù)必須使用引用傳參,使用傳值方式會引發(fā)無窮遞歸調(diào)用。

      3. 若未顯示定義,系統(tǒng)會默認缺省的拷貝構(gòu)造函數(shù)。缺省的拷貝構(gòu)造函數(shù)會,依次拷貝類成員進行初始化。

賦值運算符重載

拷貝構(gòu)造函數(shù)是創(chuàng)建的對象,使用一個已有對象來初始化這個準備創(chuàng)建的對象。賦值運算符的重載是對一個已存在的對象進行拷貝賦值。

5個C++不能重載的運算符: .*/::/sizeof/?:/.

 Date& operator = (const Date& d)
 {
  if (this != &d)//防止重復(fù)賦值
  {
   this->_year = d._year;
   this->_month = d._month;
   this->_day = d._day;
  }
  return *this;
 }

 void Test()
 {
  Date d1(2017, 7, 4);
  //拷貝構(gòu)造
  Date d2(d1);
  //賦值運算符重載
  Date d3;
  d3 = d1;
 }

3:關(guān)于隱含的this指針以及對運算符重載背后做的事情。

隱含的this指針

      1. 每個成員函數(shù)都有一個指針形參,它的名字是固定的,稱為this指針,this指針是隱式的。(構(gòu)造函數(shù)比較特殊,沒有這個隱含this形參)

      2. 編譯器會對成員函數(shù)進行處理,在對象調(diào)用成員函數(shù)時,對象地址作實參傳遞給成員函數(shù)的第一個形參this指針。

      3. this指針是成員函數(shù)隱含指針形參,是編譯器自己處理的,我們不能在成員函數(shù)的形參中添加this指針的參數(shù)定義,也不能在調(diào)用時顯示傳遞對象的地址給this指針。

例一:在拷貝構(gòu)造函數(shù)中this所做的事情

例二:在運算符重載中this做的事情

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C/C++實現(xiàn)推箱子小游戲

    C/C++實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細介紹了C/C++實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Qt qml實現(xiàn)動態(tài)輪播圖效果

    Qt qml實現(xiàn)動態(tài)輪播圖效果

    這篇文章主要為大家詳細介紹了Qt和qml實現(xiàn)動態(tài)輪播圖效果的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • C++深復(fù)制和淺復(fù)制講解

    C++深復(fù)制和淺復(fù)制講解

    這篇文章主要介紹了C++深復(fù)制和淺復(fù)制講解,C++中深復(fù)制和淺復(fù)制最大的區(qū)別在“類包含指針類型的數(shù)據(jù)成員”時,下面感興趣的小伙伴和小編一起進入文章了解更多相關(guān)內(nèi)容吧
    2022-03-03
  • C++讀取NC數(shù)據(jù)的結(jié)果與真實數(shù)值不一致的解決方法

    C++讀取NC數(shù)據(jù)的結(jié)果與真實數(shù)值不一致的解決方法

    本文介紹基于C++ 語言的netCDF庫讀取.nc格式的柵格文件時,代碼讀取到的數(shù)據(jù)與柵格文件的實際數(shù)據(jù)不一致的解決方法,文中通過代碼示例和圖文講解的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Visual?Studio2022配置ReSharper?C++?常用設(shè)置方法

    Visual?Studio2022配置ReSharper?C++?常用設(shè)置方法

    這篇文章主要介紹了Visual?Studio2022配置ReSharper?C++?常用設(shè)置,本文通過圖文并茂的形式給大家介紹的非常詳細,文中介紹了卸載Resharper的方法及Resharper激活碼,感興趣的朋友參考下吧
    2024-01-01
  • C語言開發(fā)實現(xiàn)貪吃蛇游戲

    C語言開發(fā)實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C語言開發(fā)實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Qt界面中滑動條的實現(xiàn)方式

    Qt界面中滑動條的實現(xiàn)方式

    這篇文章主要介紹了Qt界面中滑動條的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++事件處理中__event與__raise關(guān)鍵字的用法講解

    C++事件處理中__event與__raise關(guān)鍵字的用法講解

    這篇文章主要介紹了C++事件處理中__event與__raise關(guān)鍵字的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • CLion開發(fā)stm32?使用DSP庫的操作方法

    CLion開發(fā)stm32?使用DSP庫的操作方法

    這篇文章主要介紹了CLion開發(fā)stm32?使用DSP庫的方法,首先需要添加DSP庫文件到工程目錄,修改CMakeLists,添加STM32HAL庫,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • C++實現(xiàn)經(jīng)典24點紙牌益智游戲

    C++實現(xiàn)經(jīng)典24點紙牌益智游戲

    這篇文章主要介紹了C++實現(xiàn)經(jīng)典24點紙牌益智游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論