c++學習筆記之基礎篇

c++學習筆記系列:http://blog.csdn.net/column/details/17301.html


這個系列整理了一下學習c++的知識點,本篇簡單提及一些基礎的東西,涉及到一些具體的知識後面的篇章會細說。


1、基本類型取值範圍

在c++中,int、long、double、short、float等的取值範圍不是固定的,是與系統有關的,與Java不同。

2、引用參數:

在參數類型後面加&即可,如:
int &count
引用參數與原參數指向同一地址,是原參數的別名而已。與傳值參數的區別:
int m = n;
int &m = n;
第一條是值參數,將n的值賦予m,m和n沒有關係。
第二條是引用參數,將n的引用賦予m,m只是n的別名,當n或m值改變時另外一個也會跟着改變

3、防止“==”和“=”混淆

在c++中,如果“==”和“=”使用錯誤(如該使用“==”的地方使用了“=”),由於c++和Java不同,很多時候並不報錯。比如在if判斷語句中
if(n = 1)
並不會報錯(在Java中就會報錯),因爲c++中任何非零值都當成true。
爲了防止混淆,在“==”語句中一般將變量放在右邊,如:
7==n
這樣的話當寫錯成“7=n”的時候編輯器就會報錯。

4、默認實參

默認實參:函數的某個參數不經常使用,可以給函數形參一個默認值,在調用該函數時可以忽略這個參數。
默認實參必須是函數參數列表最靠右邊的參數。當調用具有多個默認實參的函數時,如果省略的實參不是形參列表中最靠右的參數,那麼該實參右邊的所有參數也必須被省略。如:
函數原型
int volume(int length = 1, int width = 1, int height = 1);
調用
volume()
volume(10)
volume(10, 8)
volume(10, 8, 2)
都是可以的。

5、一元作用域和二元作用域

作用域運算符(::)
當局部變量和全局變量有相同名字時,用一元作用域分辨運算符來區分。
在局部變量的作用域中,直接使用變量則使用的是局部變量,而加上(::)來使用變量則使用的是全局變量,如:
int number = 10;
void get(){
     int number = 1;
     number = 2;         //這時是給局部變量number賦值
     ::number = 3;       //這時是給全局變量number賦值
}
當局部變量和類作用域變量有相同名字時,用二元作用域分辨運算符來區分。
與上面類似,加上(類型::)來使用變量是類作用域變量。

注意區分類作用域變量和全局變量,全局變量不在類內部。

6、重載與默認參數

當函數有默認參數時,重載時要格外注意,防止出現二義性。如:
函數原型
int volume(int length = 1, int width = 1, int height = 1);
重載函數
int volume(int length, int width)
這樣的話當調用volume(2, 3)時編譯器就不知道選擇哪個函數。

7、函數模板

所謂函數模板實際上是建立一個通用函數,其涵涵素類型額形參類型不具體指定,用一個虛擬的類型來代表,這個通用函數就稱爲函數模板。
凡是函數體相同的函數都可以用這個模板來代替,不必定義多個函數,只需要在模板中定義一次即可。在調用函數時,系統會根據實參的類型來取代模板中的虛擬類型,從而實現了不同函數的功能。
定義函數模板的一般形式爲:template <typename T>或者template <class T>
例如:
template<typename T>
T n_add(T a,T b){}
可以替代:
int n_add(int a,int b)
double n_add(double a,double b)
等函數,不必重複定義這麼多函數了。

8、求值順序

c++中沒有指定大多數運算符其操作數的求值順序。只明確指定了“&&”、“||”、“,”、“?:”這四種運算符的操作數的求值順序。
所以不能直接認爲操作數的順序是從左向右的,不同的編譯器可能順序不同。
如:
int c;
int a(){
     return c + 2;
}
int b(){
     return c++;
}
a() + b();
不能直接認爲a()一定在b()前運算,所以在做改變了操作數中自身值得運算一定要格外小心

9、常量的聲明和賦值

使用const限定符聲明一個常量變量,常量變量必須在聲明時用一個常量表達式來初始化,而且之後不能修改。
聲明常量是沒有賦值,是一個編譯錯誤。
在可執行語句中給常量變量賦值也是一個編譯錯誤。

10、setfill

填充指定字符,是粘性的。所以一條語句中setfill後面的都會進行填充。
注意:因爲是粘性的,所以setfill之後如果不再需要填充一定要恢復。

11、拷貝構造函數

必須以引用的形式接收參數,而非值,否則會無窮遞歸
因爲如果是值的形式,在調用拷貝構造函數時,會傳一份拷貝,這樣又調用了拷貝函數,產生了無限遞歸。

12、虛懸指針

如果兩個對象都指向同一內存,一個對象回收時析構函數會刪除這塊內存的分配。另外一個對象就變成了虛懸指針,會引起運行錯誤。

13、函數返回局部變量

返回局部變量引用或指針是常見的錯誤,因爲局部變量在函數完成就回收了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章