孔乙己之一 this

2021-06-16 00:48:23 字數 1451 閱讀 4239

本文出處:

#include 

using namespace std;

class myclass ;

~myclass(){};

void print()

};

int main()

這位兄弟有疑問的是: 為什麼3和4兩種方法, 下標不正確, 而其結果卻完全正常? 顯示的結果是:

hello!

hello!

hello!

hello!

我把程式改了改, 將類myclass調整成以下結構:

class myclass ;

~myclass(){};

int data1,data2;

void print()

};

再次編譯(編譯環境是gcc 4.2), 執行, 結果如下:

hello! data1: 1 data2: 2

hello! data1: 1 data2: 2

hello! data1: 0 data2: 135153

段錯誤這其實又是乙個老生常談的問題. 要搞清這個問題, 就得先弄明白類函式是如何被編譯以及如何被執行的? 關於這點, "c++物件模型"上有甚為詳細的講解, 在此一筆帶過:

對於類成員函式而言, 並不是乙個物件對應乙個單獨的成員函式體, 而是此類的所有物件共用這個成員函式體, 當程式被編譯之後, 此成員函式位址即已確定. 我們常說, 呼叫類成員函式時, 會將當前物件的this指標傳給成員函式. 沒錯, 乙個類, 它的成員函式體只有乙份, 而成員函式之所以能把屬於此類的各個物件的資料區別開, 就在於每次執行類成員函式時, 都會把當前物件的this指標(也即物件首位址)傳入成員函式, 函式體內所有對類資料成員的訪問, 都會被轉化為this->資料成員的方式.

說到這裡, 問題也就清楚了. 當print函式裡, 只有"cout << "hello" << endl;"這條語句時, 由於print函式並沒有訪問物件的任何資料成員, 那麼此時傳進來的物件this指標實際上是沒有任何用處的, 這樣的函式, 其特徵與全域性函式並沒有太大區別. 但當後來把類myclass結構作了調整後, 由於print函式要訪問類的資料成員data1和data2, 而類的資料成員, 是伴隨著物件宣告而產生的, 但是, 我們只new了乙個myclass, 顯然, 下標"1"和下標"10000000"的myclass物件根本不存在, 那們對它們的資料成員訪問也顯然是非法的.

但是, 還有另乙個問題, 當把類myclass再作一次調整, 成這樣:

class myclass ;

~myclass(){};

int data1;

void print()

};

也就是只含有乙個int型別的資料成員時, pmyclass[1].print()的訪問結果有時卻是正確的(不同的機子上會有不同的結果). 我想, 這個只能解釋為位址對齊所造成的了(暫時存疑, 查證中, 欲知後事, 下回分解).

孔乙己之一 this

本文出處 include using namespace std class myclass myclass void print int main 這位兄弟有疑問的是 為什麼3和4兩種方法,下標不正確,而其結果卻完全正常?顯示的結果是 hello hello hello hello 我把程式改了改...

孔乙己之網路篇

本老實是需要跪著插網線而穿襯衫的唯一的人。他青白臉色,戴一副塑料眼鏡,眼睛裡時常布滿血絲 一部亂蓬蓬的花白的頭髮。穿的雖然是襯衫,可是又肥又大,似乎根本沒有裁好。他對人說話,總是滿口ping telnet之類的話,叫人半懂不懂。因為他名字帶乙個本字,為人又老實本分,便替他取下乙個綽號,叫做本老實。本...

孔乙己 new的五種寫法

這個是目標類 int 擁有乙個字面常量建構函式,和乙個平凡析構函式 可以從int構造,也可以隱式轉換為int 也可以和int比較大小 class int int operator int bool operator int right bool operator int right 第一種寫法 第二...