c++易错点总结
c++易錯(cuò)點(diǎn)的話還挺多
1.關(guān)于調(diào)用拷貝構(gòu)造函數(shù)
(1)使用一個(gè)已經(jīng)創(chuàng)建完畢的對(duì)象初始化一個(gè)新的對(duì)像
(2)值傳遞的方式給函數(shù)參數(shù)傳值
#include<iostream>using namespace std;class A{public:A(int c){a=c;} A(A &p){ cout<<"拷貝構(gòu)造函數(shù)!"<<endl; a=p.a;} ~A(){cout<<"析構(gòu)函數(shù)"<<endl; }private:int a;};void text(A a)//實(shí)參傳遞給形參的時(shí)候會(huì)拷貝一個(gè)新的函數(shù){}int main(){A a(1);text(a);return 0;}(3)值方式返回局部對(duì)象
#include<iostream>using namespace std;class A{public:A(){cout<<"默認(rèn)構(gòu)造!"<<endl; } A(A &p){ cout<<"拷貝構(gòu)造函數(shù)!"<<endl; a=p.a;} ~A(){cout<<"析構(gòu)函數(shù)"<<endl; }private:int a;};A text(){A a; return a;}int main(){A b=text();return 0; }2.對(duì)于c++t源代碼的關(guān)鍵字所有的template可以用class替換然而有些class卻不能被template替換
3.通過繼承可以建立類族
4.關(guān)于類模板
5.定義類動(dòng)態(tài)對(duì)象數(shù)組時(shí)其元素只能靠調(diào)用該類的默認(rèn)構(gòu)造函數(shù)初始化
6.類模板不能派生,類模板實(shí)例化的對(duì)象叫量產(chǎn)(模板類),且量產(chǎn)的類之間沒有任何關(guān)系
7.關(guān)于動(dòng)態(tài)特性
在絕大多數(shù)情況下, 程序的功能是在編譯的時(shí)候就確定下來的, 我們稱之為靜態(tài)特性。 反之, 如果程序的功能是在運(yùn)行時(shí)刻才能確定下來的, 則稱之為動(dòng)態(tài)特性。C++中, 虛函數(shù),抽象基類, 動(dòng)態(tài)綁定和多態(tài)構(gòu)成了出色的動(dòng)態(tài)特性。
8.派生類子對(duì)象就是派生類的數(shù)據(jù)成員中有其他類的對(duì)象,基類子對(duì)象是基類數(shù)據(jù)成員中有其他類的對(duì)象
9.只有公有的繼承下派生類是基類的子類型
10.關(guān)于子類型:
派生類derived從基類base公有繼承。因此類derived是類base的一個(gè)子類型,類derived具備類base中的操作,或者說類base中的操作可以被用于操作類derived的對(duì)象。
注:子類型關(guān)系具有傳遞性。子類型關(guān)系可以傳遞,但是不可逆。
公有繼承可以實(shí)現(xiàn)子類型關(guān)系。通過公有繼承,派生類得到了基類中除了構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的所有成員,而且可訪問成員的訪問控制屬性也和基類完全相同。這樣,派生類對(duì)象就可以作為基類的對(duì)象使用,但它只能使用從基類繼承的成員。
具有子類型關(guān)系的基類和派生類的對(duì)象之間滿足如下賦值兼容規(guī)則:
(1)公有派生類的對(duì)象可以賦值給基類的對(duì)象,即用公有派生類對(duì)象中從基類繼承來的成員,逐個(gè)賦值給基類對(duì)象的成員。
例: derived d;
base b;
b=d;
(2)公有派生類的對(duì)象可以初始化基類的引用。
例: derived d;
base &ref=d;
(3)公有派生類的對(duì)象的地址可以賦值給指向基類的指針。
例: derived d;
base ptr=&d;
11.轉(zhuǎn)換函數(shù):
他是一種特殊的類成員函數(shù),轉(zhuǎn)換函數(shù)必須是成員函數(shù),他的聲明不能指定返回類型和參數(shù)列表
12.靜態(tài)成員函數(shù)不能聲明為虛函數(shù)
13.看一道題
9.下列語句錯(cuò)誤的是( B )
A.char name[5]=“John”;name[2]=‘a(chǎn)’; Bcharp=“John”;p[2]=‘a(chǎn)’;
C.char name[5]=“John”,*p=name;p[2]=‘a(chǎn)’;
D.char name[5]=“John”,*p=&name[2];*p='a;
解析B中你構(gòu)建了一個(gè)字符串?dāng)?shù)組,你把J的首地址返回給了p,但是編譯器會(huì)認(rèn)為你的p是一個(gè)字符指針而不是字符數(shù)組指針?biāo)詐[2]無法使用
如果想讓p[2]能被使用可以如下:
14.c++每個(gè)類的成員函數(shù)隱含的第一個(gè)參數(shù)的參數(shù)名為this指針,指向?qū)ο笞约?#xff1b;
15.關(guān)于枚舉類型,首先它不是基本數(shù)據(jù)類型,以下面的例子說明:
枚舉類型的第一個(gè)常量默認(rèn)值是0,而且依次加1,枚舉類型允許彼此的值相等,雖然枚舉類型是整形類,但是不允許使用整數(shù)直接給枚舉變量賦值也不允許與整數(shù)進(jìn)行運(yùn)算,只可以與整數(shù)進(jìn)行比較;
16.(1)const int a和int const a;完全等價(jià)其值后續(xù)操作不能改變
(2)const int *p與int const *p;完全等價(jià)作用均為聲明指向整形常量的整形指針p,指針指向內(nèi)存空間的內(nèi)容不可以被修改但指針的指向可以被修改;
(3)int *const p;p所指內(nèi)存空間的內(nèi)容可被修改但p指向固定不可以被修改;
17.位運(yùn)算(化成八位二進(jìn)制)
(1)~:按位求反,把0變成1把1變成0;
比如二進(jìn)制1001011
變成0110100
(2)<<:2(2代表向左移動(dòng)兩位)左移,向左移動(dòng)右邊補(bǔ)0,>>效果和它類似;
(3)&:兩個(gè)二進(jìn)制1——1得1剩下都是0;
(4)^:相同得0,不同得1;
16.0x+數(shù)十六進(jìn)制,0+數(shù)字八進(jìn)制,e后面不能跟小數(shù)
17.c++存儲(chǔ)類別,auto,register,static,extern,mutable;
18.聲明邏輯類型的變量所用的關(guān)鍵字是bool;
19.用于控制輸入輸出格式的枚舉常量中代表十進(jìn)制八進(jìn)制十六進(jìn)制的分別是;dec oct hex
20.關(guān)于內(nèi)聯(lián)函數(shù):
(1).不能存在任何形式的循環(huán)語句
(2).不能存在過多的條件判斷語句
(3).函數(shù)體不能過于龐大
(4).不能對(duì)函數(shù)進(jìn)行取址操作
內(nèi)聯(lián)函數(shù)和宏定義基本類似
優(yōu)點(diǎn)是減少函數(shù)得調(diào)用開銷,提高運(yùn)行效率;
缺點(diǎn)是用時(shí)間換取空間,用到內(nèi)斂的時(shí)候都要重新編譯;
內(nèi)聯(lián)函數(shù)可以重載;
另外內(nèi)聯(lián)函數(shù)和代碼運(yùn)行的快慢無關(guān);
21.內(nèi)部函數(shù)和外部函數(shù):
內(nèi)部函數(shù)又被稱為靜態(tài)函數(shù),只能是本文件使用用static定義
外部函數(shù)
22.(1)strcmp(a,b)返回值如果a,b相同返回0,否者返回非0整數(shù);
(2)字符串大小比較,從第一個(gè)字符開始比較大小,直到比較出大小為止;
23.數(shù)組名代表首地址且不可以改變,比如a[10],不能a=a+1,a叫做地址常量;
數(shù)組名作為函數(shù)參數(shù),主調(diào)函數(shù)和被調(diào)函數(shù)共用一段存儲(chǔ)單元
總結(jié)
- 上一篇: 关于静态联编和动态联编
- 下一篇: 剑指offer之斐波那契问题(C++/J