在c++中i如果是物件,就可以通過"."來呼叫i中的成員變數。
如果i是指標的話,就不能通過"."來呼叫,而只能使用"->"來呼叫。
在c語言中不存在物件的概念。
這種情況的出現是因為使用了結構,例如
struct candybar;
在程式中
candybar snack=;
我們就可以用snack.weight來取得結構中的值。
這時是不能使用"->"來呼叫的,"->"符號指針對指標來說的。
如下情況可以使用"->"
candybar* bird;
bird->weight=2.33;
此時bird為乙個candybar結構的位址指標。所以可以使用"->",而此時就不能使用
"."來操作。因為"." "相當於"物件的成員呼叫。
首先介紹一下c++中的結構。對於乙個結構來說,
struct mystruct ;
如果有個變數mystruct s,那麼使用其中的成員元素時可以用
s.member_a = 1;
如果採用指標方法訪問,比如mystruct * ps,那麼同樣的訪問必須用箭頭號:
ps->member_a = 1;
::只用在類成員函式和類成員變數中。比如,宣告乙個類:
class ca ;
那麼在實現這個函式時,必須這樣書寫:
int ca::add(int a, int b)
另外,雙冒號也常常用於在類變數內部作為當前類例項的元素進行表示,比如:
int ca::add(int a)
表示當前類例項中的變數ca_var。
c++中當定義類物件是指標物件時候,就需要用到->指向類中的成員;當定義一般物件時候時就需要用到"."指向類中的成員.......
例如:class a
如果定義如下:
a *p則:p->play()使用; 左邊是結構指標。
a p 則:p.paly()使用; 左邊是結構變數。
相同點:兩個都是二元操作符,其右操作符是成員的名稱。
不同點:點操作符左邊的運算元是乙個「結果為結構」的表示式;
箭頭操作符左邊的運算元是乙個指向結構的指標。
舉例說明:
#include
song_t song1,song2, //兩個song_t型別的物件
*psong = &song1; //和乙個指向song_t的指標
strcpy(song1.composer,"ottma liebert");
song1.duration = 251;
song1.published.year = 1998;
if((*psong).duration >180)
printf("the song is more than 3 mimutes long.\n");
--最後一句也可以改寫為:
if(psong->duration > 180) ....
另外一點體會:如果乙個函式的傳入引數是結構體,且需要該結構體作為返回值的時候,必須採用指標傳遞的方式,其中對結構體賦值必須使用箭頭運算子。
int isetvalue(song_t *psong)
C 中點運算子和箭頭運算子的區別
ps 需要快速看結論的,直接看文末總結歸納,需要理解的可以從文首開始看。p member執行為p offset member 目標的記憶體位址 s.member變成訪問 s offset member 目標的記憶體位址 因此實際上功能完全一致,看起來 p member更加直接一些,只不過s.memb...
C語言 運算子與 運算子
我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如 輸出結果為 然而,我們期望輸出的結果是 5 20 2513 14 27 這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集 帶參巨集 中,號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果a是乙個巨集形參,那麼 a就是...
C語言算術運算子與位運算子
1.算術操作符 前兩個不用多說,即是乘號,是求餘 取模 運算,注意 兩側運算元需均為整數 若除數與被除數符號不同,則結果符號與被除數保持一致。如 14 3 2 14 3 2 是求商運算,注意 若 的除數與被除數均為整數將執行舍位 即捨去小數中任何部分 如14 3 4 若除數與被除數符號不同,則結果符...