首頁(yè)技術(shù)文章正文

C++易犯錯(cuò)知識(shí)點(diǎn)(一)

更新時(shí)間:2018-01-23 來源:黑馬程序員 瀏覽量:

1、賦值構(gòu)成一個(gè)表達(dá)式,具有值,其值為賦值符左邊表達(dá)式的值。表達(dá)式和語(yǔ)句的一個(gè)重要區(qū)別是,表達(dá)式有值,而語(yǔ)句沒有值。

2、隱式類型轉(zhuǎn)換總是朝著表達(dá)數(shù)據(jù)能力更強(qiáng)的方向,并且轉(zhuǎn)換總是逐個(gè)運(yùn)算符進(jìn)行的。如

float f=3.5;

int n=6;

long k=21;

double ss=f*n+k/2;//在計(jì)算ss時(shí),首先將f和n轉(zhuǎn)換成double,算得21,然后計(jì)算k/2得10,再將10(long int)轉(zhuǎn)換成double,最后得31。

27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地

有符號(hào)數(shù)向無符號(hào)數(shù)轉(zhuǎn)換。

3、當(dāng)又有聲明又有定義時(shí),定義中不允許出現(xiàn)默認(rèn)參數(shù),如果函數(shù)只有定義,才允許默認(rèn)參數(shù)出現(xiàn)在定義中。默認(rèn)值可以是一個(gè)全局變量,全局常量,或是一個(gè)函數(shù),但是不能是局部變量,因?yàn)槟J(rèn)參數(shù)的函數(shù)調(diào)用是在編譯時(shí)確定的,而局部變量的位置和值在編譯時(shí)是無法確定的。如

int a=1;

void fun()

{

int i;

void g(int x=i); //not right

int g(int x=a); //right

}

4、define宏定義指令

1) 使用其定義常量已被C++中的const定義語(yǔ)句所代替。

2) 用來定義帶參數(shù)的宏,已被C++的內(nèi)聯(lián)函數(shù)所代替。

3) 其一個(gè)有效的使用是在條件編譯中。

5、編譯時(shí)必須知道數(shù)組的大小。如

int a[]={1,2,3,4,5};//編譯器會(huì)自動(dòng)去數(shù)

for(int i=0;i

...

6、C++會(huì)把注釋當(dāng)做空格。

7、Free和malloc

int* a;

a=(int*)malloc(sizeof(int));

cout<<a<<endl;< p="">

free((void*)a);

int* b;

b=(int*)malloc(12*sizeof(int));

cout<<b<<" p="">

指向常量的指針常量:具有上述兩具指針的特點(diǎn),須在定義時(shí)初始化,且一旦賦值,則以后該指針的值將不會(huì)再發(fā)生變化,且通過指針不能改變所指向的變量的值,形如const int* const cpc="perfect";注意,這種情況下,*cpc的值也是不能改變的,如*cpc=n是不對(duì)的。

int main()

{

char* const pc="abcd";

cout<<pc<<endl;< p="">

cout<<*pc<<endl;< p="">

//*pc='b'; //有些編譯器可以通過,但是結(jié)果不對(duì)的

//cout<<pc<<endl;< p="">

const char* const cpc="perfect";

cout<<cpc<<endl;< p="">

cout<<*cpc<<endl;< p="">

*cpc='n';//not right

cout<<cpc<<endl;< p="">

return 1;

}

9、sum(int array[],int n)與sum(int* array,int n)是等價(jià)的。

10、函數(shù)返回值,可以返回堆地址,也可以返回全局或靜態(tài)變量的地址,但是不能返回局部變量的地址。

11、void指針是空類型指針,它不指任何類型,它僅僅是一個(gè)地址,不能進(jìn)行指針運(yùn)算,也不能進(jìn)行間接引用。

NULL與void* 是不同的概念,NULL是一個(gè)指針值,任何類型的指針都可賦予該值。而void* 是一種類型(語(yǔ)法上是一個(gè)類型,本質(zhì)上不是,沒有任何一個(gè)變量或?qū)ο?,其類型為void),是一種無任何類型的指針。不允許對(duì)void進(jìn)行引用。

12、由引號(hào)(" ")標(biāo)識(shí),但不是用來初始化數(shù)組的字符串,是字符串常量,如cout<<"hello"<<endl;中,"hello"就是字符串常量。字符串常量的類型是指向字符的指針(char*),它與字符數(shù)組名同屬于一種類型。< p="">

由于字符串常量的地址屬性,兩個(gè)同樣字符組成的字符串常量是不相等的, 字符串常量的比較是地址的比較。

字符串常量,字符數(shù)組名(常量指針),字符指針均屬于同一種數(shù)據(jù)類型。

13、不能建立引用的數(shù)組,因?yàn)閿?shù)組是某個(gè)數(shù)據(jù)類型的集合,數(shù)組名表示起始地址,它不是數(shù)據(jù)類型。如

int a[10];

int& a1[10]=a; //not right

引用本身不是一種數(shù)據(jù)類型(int&不是類型,定義時(shí)也不產(chǎn)生內(nèi)存空間),所以沒有引用的引用。也沒有引用的指針。引用是變量或?qū)ο蟮囊?,而不是類型的引用,所以有空指針,但是沒有空引用。

Int& ri=NULL //沒有意義

可以用引用返回值。在通常情況下,C++會(huì)建立一個(gè)臨時(shí)變量以將函數(shù)返回值帶回。但是如果用引用,則不用建立臨時(shí)變量。

C++規(guī)定,臨時(shí)變量或?qū)ο蟮纳芷谠谝粋€(gè)完整的語(yǔ)句表達(dá)式結(jié)束后便宣告結(jié)束。所以如果以返回值初始化一個(gè)引用,應(yīng)當(dāng)先建立一個(gè)變量,將函數(shù)返回值賦于這個(gè)變量,作如下處理:

int x=fn1(5.0); //在這一句后臨時(shí)變量生命周期將結(jié)束

int& b=x;

*************************

float temp;

float& fn2(float r)

{

temp=10*r;

return temp;

}

用如上的方法,則函數(shù)返回值將不再創(chuàng)建臨時(shí)變量,而直接與全局變量temp共享內(nèi)存單元

*******************************

以引用的初始化,可以是變量,也以是常量,也可以是一定類型的堆空間變量,但是引用不是指針,如下表達(dá)是不對(duì)的:

int& a=new int(2); //not right

下面是用堆空間變量初始化引用的一個(gè)例子:

#include

#include

using namespace std;

int main()

{

double* pd=new double;

if(pd==NULL)

{printf("failed");exit(1);}

cout<


本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!


作者:黑馬程序員C/C++培訓(xùn)學(xué)院


首發(fā):http://c.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!