亚洲高清vr播放在线观看,欧美亚洲精品免费,欧美日韩天堂在线视频,午夜福利小视频

      學(xué)習(xí)啦 > 知識(shí)大全 > 知識(shí)百科 > 百科知識(shí) > 學(xué)c++要了解什么(2)

      學(xué)c++要了解什么(2)

      時(shí)間: 謝君787 分享

      學(xué)c++要了解什么

        C++基礎(chǔ)知識(shí)學(xué)習(xí)小總結(jié)

        一、new和malloc的區(qū)別

        1、new和delete配對(duì),釋放數(shù)組需要用delete[]。new和delete實(shí)際上調(diào)用了malloc和free,另外調(diào)用了類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。

        2、malloc和free配對(duì),malloc返回的是void指針,需要強(qiáng)轉(zhuǎn)。

        3、new申請(qǐng)的內(nèi)存保存在堆中,malloc申請(qǐng)的內(nèi)存保存在自由存儲(chǔ)區(qū)。

        二、C++運(yùn)算符

        1、取模操作符:%

        2、邏輯否、與、或:!, &&, ||

        3、三元操作符:

        c = (a>b) ? a : b;

        4、按位與、或、非

        & AND 邏輯與 Logic AND

        | OR 邏輯或Logic OR

        ~ NOT 對(duì)1取補(bǔ)(位反轉(zhuǎn))Complement to one (bit inversion)

        5、按位移:

        << SHL 左移Shift Left

        >> SHR 右移Shift Right

        三、&: 取地址運(yùn)算符、定義變量引用

        &操作符用于取地址時(shí)的用法是:int* x=&y;。

        然而,另外一種用法是定義變量別名,這種用法不能和取地址簡(jiǎn)單等同。用于傳遞函數(shù)輸入?yún)?shù)時(shí)很好理解,但定義變量時(shí)容易引起理解錯(cuò)誤,特別是和指針的區(qū)別:

        從內(nèi)存的角度看,指針和引用是完全不同的。指針,內(nèi)存要為它分配一個(gè)存儲(chǔ)空間。引用,內(nèi)存不分配空間的,引用只是一個(gè)別名。我認(rèn)為就是在符號(hào)表里增加一個(gè)標(biāo)志而已,對(duì)于語(yǔ)句int &y=x; (&x=&y)為true。

        實(shí)際上“引用”可以做的任何事情“指針”也都能夠做,為什么還要“引用”這東西?答案是“用適當(dāng)?shù)墓ぞ咦銮∪缙浞值墓ぷ?rdquo;。當(dāng)重載某個(gè)操作符時(shí),你應(yīng)該使用引用。最普通的例子是操作符[]。這個(gè)操作符典型的用法是返回一個(gè)目標(biāo)對(duì)象,其能被賦值。如果操作符[]返回一個(gè)指針,那么后一個(gè)語(yǔ)句就得這樣寫:

        *v[5] = 10;

        但是這樣會(huì)使得v看上去象是一個(gè)向量指針。因此你會(huì)選擇讓操作符返回一個(gè)引用。

        引用的一些規(guī)則如下:

        (1)引用被創(chuàng)建的同時(shí)必須被初始化(指針則可以在任何時(shí)候被初始化),否則會(huì)報(bào)編譯錯(cuò)誤。

        (2)一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時(shí)改變所指的對(duì)象)。

        以下示例程序中,k被初始化為i的引用。語(yǔ)句k = j并不能將k 修改成為j 的引用,只是把k的值改變成為6。由于k是i的引用,所以i 的值也變成了6。

        int i = 5;

        int j = 6;

        int &k = i;

        k = j; // k 和i 的值都變成了6;

        (3)不能有NULL 引用,引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)(指針則可以是NULL)。

        以下的寫法將地址指向一個(gè)位置的內(nèi)存,是錯(cuò)誤的。結(jié)果將是不確定的(編譯器能產(chǎn)生一些輸出,導(dǎo)致任何事情都有可能發(fā)生)

        char *pc = 0; // 設(shè)置指針為空值

        char& rc = *pc; // 讓引用指向空值

        (4)“sizeof 引用”得到的是所指向的變量(對(duì)象)的大小,但是當(dāng)引用作為成員時(shí),其占用空間與指針相同(沒找到標(biāo)準(zhǔn)的規(guī)定)。

        (5)引用只能指向一個(gè)實(shí)際的變量,不能指向指針或引用

        (int*) * p1; // p1是指針的指針

        (int*) & p2; // p2是指向整型指針的引用

        引用不能指向指針或引用!

        (int&) * p3; // ERROR: 不能有指向引用的指針,因?yàn)橐弥皇且粋€(gè)別名

        (int&) & p4; // ERROR: 不能有指向引用的引用,因?yàn)橐弥皇且粋€(gè)別名

        (6)指針和引用在內(nèi)部的實(shí)現(xiàn)其實(shí)是沒多大的區(qū)別的。但使用時(shí)有些地方是要注意的。因?yàn)橐镁哂袑?duì)象行為,這一點(diǎn)很重要。引用復(fù)制時(shí)會(huì)調(diào)用對(duì)象的復(fù)制函數(shù),在涉及多態(tài)時(shí),這地方很容易出錯(cuò)。

        class A{...};

        class B:public A{...};

        void f(A&a1,A&a2)

        {

        a1=a2;//此處調(diào)用的只有基類A的復(fù)制函數(shù),而B部分不會(huì)被進(jìn)行復(fù)制,之將導(dǎo)致數(shù)據(jù)的不一致(即B部分的數(shù)據(jù)沒有被復(fù)制);

        a1.fun();

        }

      熱門文章

      1252263