真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

類與對象的認識

類和對象

c是一門面向過程的語言關(guān)注的過程,c++作為一門面向?qū)ο蟮恼Z言關(guān)注的時對象,把事情拆分為不同的對象,通過對象的交互來實現(xiàn)。

創(chuàng)新互聯(lián)是一家專業(yè)提供玉泉街道企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為玉泉街道眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

一.類和對象的初認識

1.類的引入
類用關(guān)鍵字class引出,與之前的結(jié)構(gòu)體類似,不同的是結(jié)構(gòu)體內(nèi)不能定義函數(shù)而在類中可以定義函數(shù)啦(c++中結(jié)構(gòu)體也可以定義函數(shù)哦)
2.類的定義
類中成員函數(shù)的兩種定義方式:可以在類中定義定義,但編譯器有可能將其當(dāng)作內(nèi)聯(lián)函數(shù)來處理故推薦第二種——將函數(shù)的聲明和定義分開。
3.類的訪問限定符
public、protected、private--->protected和private修飾的對象在類外不能直接訪問
class類默認是private,struct默認是public
面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài),這里我們說一下封裝的定義:將數(shù)據(jù)和操作數(shù)據(jù)的方法進行有機結(jié)合,隱藏對象的屬性和實現(xiàn)細節(jié),僅對外公開接口來和對象進行交互。
4.類的作用域
類定義了一個新的作用域,若要訪問類中的成員要用作用域限定符::進行訪問。
在這里我們已經(jīng)接觸了四個作用域:全局作用域、函數(shù)內(nèi)的局部作用域、類、命名空間。
5.類的實例化(對象)
類限定了有那些成員,類是沒有空間開辟的,用類創(chuàng)建出的對象才有實際的內(nèi)存空間。
到這里我們要思考一個問題,一個類的大小該如何計算呢??類中可以包含成員函數(shù),此時又該怎么辦呢??
通過測試我們可以知道類的大小其實就是類的成員變量的大小,類中的成員函數(shù)被放在公共代碼區(qū),要注意內(nèi)存對齊的問題。如果是一個空類,或這個類中只有成員函數(shù),呢么這個類的大小是1,因為創(chuàng)建對象時要有區(qū)分。
6.this指針
c++對每個成員函數(shù)增加了一個默認的指針參數(shù),讓該指針指向當(dāng)前對象(函數(shù)運行時調(diào)用該函數(shù)的對象),在函數(shù)體中所有成員變量的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。呢么這個就相當(dāng)于我們用戶自己在傳參時傳入地址,正因為有this指針的存在所以函數(shù)才能準確的訪問到調(diào)用它的主體。

  • this指針的特性
  • this指針的類型:類類型 * const,故this指針的指向是不能修改的。
  • this指針作為函數(shù)的形參,函數(shù)調(diào)用時將對象的地址傳給this形參,故對象中不存儲this指針

    二.類中的默認函數(shù)之構(gòu)造函數(shù)

    一個類定義好的話里面并不是什么都沒有,會自動生成六個默認函數(shù)
    1.構(gòu)造函數(shù)
    構(gòu)造函數(shù)是干什么的呢?
    構(gòu)造函數(shù)是一個特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對象時由編譯器自動調(diào)用,保證每個數(shù)據(jù)成員都有 一個合適的初始值,并且在對象的生命周期內(nèi)只調(diào)用一次。也就是說構(gòu)造函數(shù)完成了對象的初始化,它的特點是:函數(shù)名與類名相同、無返回值、對象實例化時編譯器自動調(diào)用對應(yīng)的構(gòu)造函數(shù)、構(gòu)造函數(shù)可以重載。系統(tǒng)自動生成的是無參的構(gòu)造函數(shù),當(dāng)然我們可以自己寫一個帶有參數(shù)的構(gòu)造函數(shù),那么我們在定義對象的時候就可以直接初始化拉,看下面的代碼:
    class data
    {
    public:
    data(int year=1999,int month=1,int day=1)
    {
    _year = year;
    _month = month;
    _day = day;
    }
    private:
    int _year;
    int _month;
    int _day;
    };

那么在這個地方我們就完成了構(gòu)造函數(shù)的創(chuàng)建,呢么在主函數(shù)內(nèi)定義對象的時候就可以直接初始化對象:
data a (1999,10,13);

那么我們知道系統(tǒng)給的是無參的構(gòu)造函數(shù),所以我們在定義無參構(gòu)造函數(shù)的時候就不需要帶(),否則就變成了函數(shù)聲明。
上述的代碼就是我們顯式創(chuàng)建的構(gòu)造函數(shù),當(dāng)有它存在的時候編譯器就不會再生成默認構(gòu)造函數(shù)

還有一個注意的點:無參構(gòu)造函數(shù)和全缺省構(gòu)造函數(shù)都稱作默認函數(shù),是不允許重復(fù)定義的,只允許存在一個,故這兩個是不能構(gòu)成重載函數(shù)的。

呢么構(gòu)造函數(shù)的作用是什么呢?-->因為變量類型不只是固定的int或char這種,也有可能是用戶自定義類型,那么構(gòu)造函數(shù)就會調(diào)用這種自定義類型的成員函數(shù),這就是它的作用。

2。構(gòu)造函數(shù)賦初值
上述過程中在構(gòu)造函數(shù)體內(nèi)的操作并不是初始化,那么我們習(xí)慣將用構(gòu)造函數(shù)的初始化列表對其進行初始化。

初始化列表:以一個冒號開始,接著是一個以逗號分隔的數(shù)據(jù)成員列表,每個"成員變量"后面跟一個放在括號中的初始值或表達式。
public:
data(int year=1999,int month=1,int day=1)
:_year(year)
, _month(month)
, _day(day)
{

}

注意:1.就算沒有初始化列表系統(tǒng)也會自動生成一個初始化列表,每個變量只能初始化一次,而且當(dāng)成員變量是引用類型、const修飾、類類型成員變量(沒有默認構(gòu)造函數(shù))這三種情況時必須使用初始化列表對其初始化,當(dāng)一個沒有默認構(gòu)造函數(shù)的類類型成員變量不初始化系統(tǒng)也不會自動識別該如何初始化,故會出錯。

2.成員變量的初始化順序是按照成員變量的聲明順序決定的,與初始化列表的順序無關(guān),那么我們在初始化列表盡量于聲明的順序相同,更不要用變量進行賦值,極容易出錯。

  1. explicit關(guān)鍵字
    在c++中發(fā)現(xiàn)了一個有趣的現(xiàn)象,data a = 100; 這條語句居然可以通過編譯,等號兩邊的操作數(shù)類型不同卻可以通過編譯,于是我們可以研究一下這個復(fù)制重載在調(diào)用時的過程,進過測試我們發(fā)現(xiàn)在進行賦值運算符重載時首先調(diào)用了一次構(gòu)造函數(shù),為100構(gòu)造出一個類!所以構(gòu)造函數(shù)不光有構(gòu)造的作用,對于單個參數(shù)(實參)的構(gòu)造函數(shù)還有類型轉(zhuǎn)化的作用。
    但有時我們不希望有這種情況的發(fā)生,用explicit修飾在構(gòu)造函數(shù)前就會禁止這種類型轉(zhuǎn)化。


3.static成員

在c++中static可以修飾成員變量和成員函數(shù),由static修飾的變量或函數(shù)稱作靜態(tài)成員變量或靜態(tài)成員函數(shù)
static修飾的為所有類對象共享的!

區(qū)別:
| 靜態(tài)成員變量 | 普通成員變量 |
| 初始化在類外 | 類內(nèi)初始化 |
| 所有對象共享的 | 每個對象都包含了一份 |
| 也可以通過類名::靜態(tài)成員名訪問 | 只能通過對象訪問 |
| 所有對象共享的 | 每個對象都包含了一份 |

靜態(tài)成員變量不會影響類的大小,也就是計算類的大小時不需要計算靜態(tài)成員的大小,他們用的是同一塊內(nèi)存空間

| 靜態(tài)成員函數(shù) | 普通成員函數(shù) |
| 沒有隱藏的this指針 (不能訪問非靜態(tài)成員) | 有this指針 |
| 不能被const修飾 (因為const修飾成員函數(shù)實際上修飾的時this指針) | 可以 |
| 可以不通過對象調(diào)用 | 必須通過對象調(diào)用 |

用static修飾的靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量,不能訪問普通成員變量。
而普通成員函數(shù)都可以訪問。

二.析構(gòu)函數(shù)

析構(gòu)函數(shù)與構(gòu)造函數(shù)函數(shù)相對應(yīng),和構(gòu)造函數(shù)構(gòu)成函數(shù)重載,也就是說函數(shù)名也是類名,在函數(shù)名前加~代表析構(gòu)函數(shù),這個函數(shù)沒有參數(shù)和返回值,析構(gòu)函數(shù)并不是對類對象進行銷毀,而是完成類的一些資源清理工作。對象在生命周期結(jié)束時會自動調(diào)用析構(gòu)函數(shù)。

三.拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象創(chuàng)建新對象時由編譯器自動調(diào)用。

注意:拷貝函數(shù)是對構(gòu)造函數(shù)的一個重載,它的形參只有一個且必須船引用,如果傳值調(diào)用會無窮遞歸。

那么有這個函數(shù)的存在我們在定義對象時就可以用已有的對象進行新對象的定義:
如:date d1; data d2(d1);

同樣的,編譯器也會為我們生成一個默認的拷貝構(gòu)造函數(shù),但它完成的時淺拷貝工作,比如下面的情況:

class String
{
public:
    String(const char* str = "jack")
    {
        _str = (char*)malloc(strlen(str) + 1);
        strcpy(_str, str);
    }

    ~String()
    {
        cout << "~String()" << endl;
        free(_str);
    }
private:
    char* _str;
};

int main()
{
    String s1("hello");
    String s2(s1);
}

在構(gòu)造函數(shù)內(nèi)我們完成了動態(tài)創(chuàng)建內(nèi)存空間,這種情況默認拷貝構(gòu)造函數(shù)就會原封不動的把這塊地址拷貝到新對象d2中,這并不是我們想要的結(jié)果,d2和d1共用同一塊內(nèi)存空間對d2進行修改d1也會改變。這叫做淺拷貝,所以我們有必要自定義一種深拷貝的構(gòu)造函數(shù)。這個后期在做介紹。

四.賦值運算符重載

在談賦值運算符重載前我們有必要先談一下什么是運算符重載,那么兩個類是無法比較大小的,但是如果我們進行運算符重載,按照大小關(guān)系進行重載那么類也就可以使用比較運算符了,其它運算符也是一樣的。

用關(guān)鍵字operator進行運算符重載
有一類特殊的運算符重載,就是前置++和后置++的重載,為了有所區(qū)別

賦值運算符主要有四點:

  1. 參數(shù)類型
  2. 返回值
  3. 檢測是否自己給自己賦值
  4. 返回this//this作為返回值是為了解決連續(xù)賦值的問題
  5. 一個類如果沒有顯式定義賦值運算符重載,編譯器也會生成一個,完成對象按字節(jié)序的值拷貝。

同樣完成的也是淺拷貝,所以我們也有必要自己實現(xiàn)一個賦值運算符的重載。深拷貝的實現(xiàn)同樣也放在后面說。

最后兩種默認函數(shù)是普通變量和const變量的取地址,這兩種很少自己實現(xiàn)。

四.友元

如果我們對輸出運算符“<<”進行重載該怎么做呢
ostream & operator<<(ostream & _cout)------>這是對<<重載的函數(shù)函數(shù),如果這樣定義函數(shù)的話其中包含的this指針作為第一個形參,所以在調(diào)用函數(shù)想要輸出一個類的時候就不能按照常規(guī)的cout<那么我們怎么能避免這種方式而是按照常規(guī)的方式對<<進行重載呢

這里就要我們就要在全局作用域定義一個重載函數(shù)把兩個參數(shù)按照正常的順序傳入,但是在類中就不能不能引用這個函數(shù)的私有成員,我們只要在類中聲明這個函數(shù)用friend關(guān)鍵字修飾那么這個函數(shù)就是這個類的友元函數(shù)也就可以在類內(nèi)訪問了

注意:
友元函數(shù)是普通函數(shù)并不是類中的成員函數(shù)
友元函數(shù)可訪問類的私有成員,但不是類的成員函數(shù)
友元函數(shù)不能用const修飾(因為const修飾的是this指針,而友元函數(shù)并沒有this指針)
友元函數(shù)可以在類定義的任何地方聲明,不受類訪問限定符限制
一個函數(shù)可以是多個類的友元函數(shù)
友元函數(shù)的調(diào)用與普通函數(shù)的調(diào)用和原理相同

同樣一個類也可以是另一個類的友元類,這個類就可以訪問其內(nèi)部的私有成員了,但注意此過程是單向的且不能傳遞。


文章題目:類與對象的認識
鏈接分享:http://weahome.cn/article/gghdjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部