1. 程式人生 > >C++常用語法符號總結

C++常用語法符號總結

1.函式前面加了兩個冒號--表示作用域,是域作用符,前面沒有帶域名的是全域性作用域。

class A
class B;
void A::SetCurse();表示A類裡的該函式
void A::SetCurse();表示B類裡的該函

2.->這個符號是結構體運算子
每一個結構體變數中的各個成員,都可以通過結構體成員運算子“.”“->”來逐個訪問。
例如:
定義一個結構體
struct student
{
char name[10];
char number[10];
float score;
}stu1;
然後訪問其中成員,比如給成員賦值
stu1.score=65.5;
同樣也可以寫成
stu1->score=65.5;

結構體主要成員運算子有"."" ->"

多用於修改結構成員的值。

以下是具體的例子

struct date{
 int year;
 int month;
 int day;
};
int main(int argc, char* argv[])
{
 char end;
 struct date today;
 struct date* pdate;
 pdate=&today;
 today.year=2011;
 today.month=2;
 today.day=1;
 printf("year = %d\n\n",today.year);
 printf("month = %d\n\n",today.month);
 printf("day = %d\n\n",today.day);
 printf("year = %d\n\n",pdate->year);
 printf("month = %d\n\n",pdate->month);
 printf("day = %d\n\n",pdate->day);
}

Android中定義了兩種智慧指標型別,一種是強指標spstrong pointer),另外一種是弱指標(weak pointer)。強指標與一般意義的智慧指標概念相同,通過引用計數來記錄有多少使用者在使用一個物件,如果所有使用者都放棄了對該物件的引用,則該物件將被自動銷燬。弱指標也指向一個物件但是弱指標僅僅記錄該物件的地址,不能通過弱指標來訪問該物件,也就是說不能通過弱指標來呼叫物件的成員函式或訪問物件的成員變數要想訪問弱指標所指向的物件,需首先通過wp類所提供的promote()方法將弱指標升級為強指標。弱指標所指向的物件是有可能在其它地方被銷燬的,如果物件已經被銷燬,wppromote()

方法將返回空指標,這樣就能避免出現地址訪問錯的情況

假設現在有一個類MyClass,如果要使用智慧指標來引用這個類的物件,那麼這個類需滿足下列兩個前提條件:

1:這個類是基類RefBase的子類或間接子類;

2:這個類必須定義虛建構函式,即它的建構函式需要這樣定義:

virtual ~MyClass();

滿足了上述條件的類就可以定義為Android智慧指標了,定義方法和普通指標類似。比如普通指標是這樣定義:

MyClass* p_obj;

智慧指標是這樣定義:

sp<MyClass> p_obj;

定義了一個智慧指標的變數,就可以象普通指標那樣使用它,包括賦值、訪問物件成員、作為函式的返回值、作為函式的引數等。比如:

p_obj = new MyClass(); // 注意不要寫成 p_obj = new sp<MyClass> 
sp<MyClass> p_obj2 = p_obj; 
p_obj->func(); 
p_obj = create_obj(); 
some_func(p_obj);

注意不要試圖delete一個智慧指標,即 delete p_obj。不要擔心物件的銷燬問題,智慧指標的最大作用就是自動銷燬不再使用的物件。不需要再使用一個物件後,直接將指標賦值為NULL即可:

p_obj = NULL;

上面說的都是強指標,弱指標的定義方法和強指標類似,但是不能通過弱指標來訪問物件的成員。下面是弱指標的示例:

wp<MyClass> wp_obj = new MyClass(); 
p_obj = wp_obj.promote(); // 升級為強指標。不過這裡要用.而不是->,真是有負其指標之名啊
wp_obj = NULL; 

constC++才有的,和C語言的define一樣也是用來定義常量的.

即出現在const後面的是常量,是有地址的,可以用指標來指向那個常量值,但是不能修改它。

status表示狀態,是一個int型別typedef int status;或者#define status int

實際上,在自定義中有typedef int Status ;也就是說Status是一個整數型別,這種型別的變數的值是反映函式結果狀態的,它可能是OKERROR,等,而在巨集定義中OK的值為1ERROR的值為0

6.uint8_t / uint16_t / uint32_t /uint64_t  資料型別

_t一個結構的標註,可以理解為type/typedef的縮寫,表示它是通過typedef定義的,而不是其它資料型別。

uint8_tuint16_tuint32_t等都不是什麼新的資料型別,它們只是使用typedef給型別起的別名,新瓶裝老酒的把戲。不過,不要小看了typedef,它對於你程式碼的維護會有很好的作用。比如C中沒有bool,於是在一個軟體中,一些程式設計師使用int,一些程式設計師使用short,會比較混亂,最好就是用一個typedef來定義,如:
typedef char bool;

一般來說,一個C的工程中一定要做一些這方面的工作,因為你會涉及到跨平臺,不同的平臺會有不同的字長,所以利用預編譯和typedef可以讓你最有效的維護你的程式碼。為了使用者的方便,C99標準的C語言硬體為我們定義了這些型別,我們放心使用就可以了。

 按照posix標準,一般整形對應的*_t型別為:
1位元組     uint8_t
2位元組     uint16_t
4位元組     uint32_t
8位元組     uint64_t

7.C語言第十七篇:size_t 資料型別

size_t 型別表示C 中任何物件所能達到的最大長度。它是無符號整數,因為負數在這裡沒有意義。它的目的是提供一種可移植的方法來宣告與系統中可定址的記憶體區域一致的長度size_t 用做sizeof 操作符的返回值型別,同時也是很多函式的引數型別,包括malloc strlen在宣告諸如字元數或者陣列索引這樣的長度變數時用size_t 是好的做法。它經常用於迴圈計數器、陣列索引,有時候還用在指標算術運算上。

size_t 的宣告是實現相關的。它出現在一個或多個標準標頭檔案中,比如stdio.h stblib.h,典型的定義如下:

#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned int size_t;
#endif

define 指令確保它只被定義一次。實際的長度取決於實現。通常在32 位系統上它的長度是32 位,而在64 位系統上則是64 位。一般來說,size_t 可能的最大值是SIZE_MAX

通常size_t 可以用來存放指標,但是假定size_t 和指標一樣長不是個好主意。稍後的使用sizeof 操作符和指標會講到,intptr_t 是更好的選擇。

列印size_t 型別的值時要小心。這是無符號值,如果選錯格式說明符,可能會得到不可靠的結果。推薦的格式說明符是%zu。不過,某些情況下不能用這個說明符, 作為替代,可以考慮%u %lu

下面這個例子將一個變數定義為size_t,然後用兩種不同的格式說明符來列印:
size_t sizet = -5;
printf("%d\n",sizet);
printf("%zu\n",sizet);

因為size_t 本來是用於表示正整數的,如果用來表示負數就會出問題。如果為其賦一個負數,然後用%d %zu 格式說明符列印,就得到如下結果:
-5
4294967291

%d size_t 當做有符號整數,它打印出-5 因為變數中存放的就是-5%zu size_t 當做無符號整數。當-5 被解析為有符號數時,高位置為1,表示這個數是負數。當它被解析為無符號數時,高位的1 被當做2 的乘冪。所以在用%zu 格式說明符時才會看到那個大整數。

正數會正常顯示,如下所示:

sizet = 5;

printf("%d\n",sizet); // 顯示5

printf("%zu\n",sizet); // 顯示5

因為size_t 是無符號的,一定要給這種型別的變數賦正數

8.void* 指標

實可以理解為一個context,利用它可以很好的實現C語言面向物件程式設計。使用C/C++程式設計的人員看到void*,習慣性的就會認為——這是個私有資料,只有定義的一方才有權解釋;這也是我們在回撥函式中傳遞void*作為userdata的基礎共識。

void*指標其實可以用作泛型,你想象一下你在C中要交換兩個變數,如果是兩個整數的話,就像:

void swap_int(int* lhs, int* rhs){

    int tmp = *lhs;

    *lhs = *rhs;

    *rhs = tmp;

}

如果要交換小數,那還要寫一個

void swap_float(float* lhs, float* rhs){

    ;//

}

那麼既然都是把兩個變數的bit pattern交換一下,那就可以把這種方法抽象出來:

void swap(void* lsh, void* rhs){

    ;

}

因為你不知道究竟要交換多少個bit,所以,還需要一個引數來指定要交換的bit的數量:

void swap(void* lsh, void* rhs, size_t size){

    ;//

}

有了這樣一個函式,那麼如果想要交換兩個變數,那就可以:

swap(&ai, &bi, sizeof(int));

swap(&af, &bf, sizeof(float));

void* 僅僅是為了看起來合乎邏輯

但是,用回上面的例子,如果我用float*代替void*,那的確是可以的,但是我為什麼每次呼叫它都要先做強制型別轉換swap((float* )&ai, (float* )&bi, sizeof(int)),你把這樣一個介面給另外的一個人使用,他會怎麼想?我擦,你交換兩個整數,還要先轉換為float*,萬一給個新手,人家還不敢用,我擦,你這裡面有什麼奧妙麼?

的確,void*和其他指標一樣,都是佔同樣大小的記憶體空間,唯一和其他指標不同的就在於你不能對void*進行解引用,看起來其他型別的指標都可以用void*來代替,只要在解引用之前把它轉換為相應型別的指標就OK了!

9.C中宣告指標要在每個變數前面加星號

定義的時候 這個*就是用來表示指標的。
比如
int a; 這個是整型變數
int *a; 這個才是指標。
表示*a才是int
這個是C語言的規則。