學c++要了解什么(2)
學c++要了解什么
C++基礎知識學習小總結
一、new和malloc的區(qū)別
1、new和delete配對,釋放數(shù)組需要用delete[]。new和delete實際上調(diào)用了malloc和free,另外調(diào)用了類的構造函數(shù)和析構函數(shù)。
2、malloc和free配對,malloc返回的是void指針,需要強轉(zhuǎn)。
3、new申請的內(nèi)存保存在堆中,malloc申請的內(nèi)存保存在自由存儲區(qū)。
二、C++運算符
1、取模操作符:%
2、邏輯否、與、或:!, &&, ||
3、三元操作符:
c = (a>b) ? a : b;
4、按位與、或、非
& AND 邏輯與 Logic AND
| OR 邏輯或Logic OR
~ NOT 對1取補(位反轉(zhuǎn))Complement to one (bit inversion)
5、按位移:
<< SHL 左移Shift Left
>> SHR 右移Shift Right
三、&: 取地址運算符、定義變量引用
&操作符用于取地址時的用法是:int* x=&y;。
然而,另外一種用法是定義變量別名,這種用法不能和取地址簡單等同。用于傳遞函數(shù)輸入?yún)?shù)時很好理解,但定義變量時容易引起理解錯誤,特別是和指針的區(qū)別:
從內(nèi)存的角度看,指針和引用是完全不同的。指針,內(nèi)存要為它分配一個存儲空間。引用,內(nèi)存不分配空間的,引用只是一個別名。我認為就是在符號表里增加一個標志而已,對于語句int &y=x; (&x=&y)為true。
實際上“引用”可以做的任何事情“指針”也都能夠做,為什么還要“引用”這東西?答案是“用適當?shù)墓ぞ咦銮∪缙浞值墓ぷ?rdquo;。當重載某個操作符時,你應該使用引用。最普通的例子是操作符[]。這個操作符典型的用法是返回一個目標對象,其能被賦值。如果操作符[]返回一個指針,那么后一個語句就得這樣寫:
*v[5] = 10;
但是這樣會使得v看上去象是一個向量指針。因此你會選擇讓操作符返回一個引用。
引用的一些規(guī)則如下:
(1)引用被創(chuàng)建的同時必須被初始化(指針則可以在任何時候被初始化),否則會報編譯錯誤。
(2)一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象)。
以下示例程序中,k被初始化為i的引用。語句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 引用,引用必須與合法的存儲單元關聯(lián)(指針則可以是NULL)。
以下的寫法將地址指向一個位置的內(nèi)存,是錯誤的。結果將是不確定的(編譯器能產(chǎn)生一些輸出,導致任何事情都有可能發(fā)生)
char *pc = 0; // 設置指針為空值
char& rc = *pc; // 讓引用指向空值
(4)“sizeof 引用”得到的是所指向的變量(對象)的大小,但是當引用作為成員時,其占用空間與指針相同(沒找到標準的規(guī)定)。
(5)引用只能指向一個實際的變量,不能指向指針或引用
(int*) * p1; // p1是指針的指針
(int*) & p2; // p2是指向整型指針的引用
引用不能指向指針或引用!
(int&) * p3; // ERROR: 不能有指向引用的指針,因為引用只是一個別名
(int&) & p4; // ERROR: 不能有指向引用的引用,因為引用只是一個別名
(6)指針和引用在內(nèi)部的實現(xiàn)其實是沒多大的區(qū)別的。但使用時有些地方是要注意的。因為引用具有對象行為,這一點很重要。引用復制時會調(diào)用對象的復制函數(shù),在涉及多態(tài)時,這地方很容易出錯。
class A{...};
class B:public A{...};
void f(A&a1,A&a2)
{
a1=a2;//此處調(diào)用的只有基類A的復制函數(shù),而B部分不會被進行復制,之將導致數(shù)據(jù)的不一致(即B部分的數(shù)據(jù)沒有被復制);
a1.fun();
}