很多程式設計師
c語言基礎不好,結果用了好多年
c++,還是知其然而不知所以然,往往經不起別人一問
」xx機制怎麼實現的」?
this
指標就是
c++的基礎機制之一。
struct
到class
進化的第一步
設想我們是十幾年前
c++的設計者,從c的
struct
怎麼進化到
c++的
class
?struct
裡可以用函式指標作成員變數,並通過諸如
***->fun()
的形式呼叫,但和
class
成員函式相比:
1)不能在
struct
內部定義函式;
2)不能在
struct
成員函式內直接訪問
struct
的其他成員變數。這兩點形式上的侷限使得
struct
無法直接體現物件導向的思想。怎麼解決呢?問題1)struct(class)實現內部定義函式由編譯器
name mangling
機制完成,後面講述,這裡講第2點。
struct base;};
假設可在
struct
內定義函式,那要在函式裡直接訪問成員
a,b,順理成章的辦法就是設法把指向結構體變數自身的指標傳到成員函式內部,即由編譯器把函式
add_mem()
變成add_mem(void *this)
這個隱含的包含物件位址的引數就是
this
指標,c++
編譯器就能自動獲取物件位址賦給
this
,再通過乙個隱含引數把
this
傳進類的非靜態成員函式,於是函式內部訪問類的非靜態成員變數就可以借助於
this
,如:class point
voidmovepoint( int a, int b, int c)
};void main( )
movepoint
真正原型是
void movepoint( point *this,int a, int b, int c)
。物件point1
呼叫movepoint(1,1,1)
時,就把
point1
的位址傳給了
this
指標,呼叫
point1.movepoint(1,1,1)
相當於point1.movepoint (&point1,1,1,1 )
顯式使用
this
指標的場合:
this
指標保留了成員函式所屬類的例項物件位址,形式上它通常是隱含的,編譯器編譯時會自動在引用成員變數的每個表示式中插入
this
指標。不過某些特殊場合也需要顯式使用它
:情況一:在類的非靜態成員函式中返回類物件本身時,需要用
return*this
。情況二:當函式引數與成員變數同名,如:
class date……
};setyear
裡無法識別哪個
year
是類成員,哪個是引數。因此這裡就需要借用
this
指標:setyear( int year)
這樣就不會混淆了。
注意:
1. this
指標僅作用於類的非靜態成員函式內部,靜態成員函式內沒有
this
指標。2. this
指標不是物件本身的一部分,不會影響
sizeof(物件)
結果。
C篇 初識指標
變數被初始化會對應棧或者堆乙個位址,位址指向開始存放變數的值,所佔位元組數由變數型別決定。而指標就儲存變數的位址,佔4個位元組。include main 使用指標列印字串 include include int main void putchar n 使用指標交換變數值 include void s...
《C和指標》 C語言補漏 指標篇
沒錯,對於指標,我確實只能摘取書上的少許內容,因為我在資料結構的時候已經弄明白了很多,所以這一部分並沒有仔細的看,還有後面的用 c語言實現抽象資料型別,資料結構裡也有講,所以我建議還是先看 c和指標 再去學資料結構。1.在宣告指標變數時,可以為它指定初始值,如 char message hello ...
c語言基礎(二)指標篇
定義乙個int型別的變數i int i 10 定義乙個int型別的一級指標變數 int p 把i對應的位址賦給p變數 p i 指標取值 p 把p變數對應的位址的值取出來 printf p d p 首先我們定義的指標變數p,其實p就是用來存放位址的,我們把i的位址賦給p,那麼p的值其實就是i的位址,p...