目錄
成員變數和成員函式分開儲存
只有非靜態成員變數才屬於類的物件上
空物件占用位元組為1
class person
;void test01()
int main()
占用記憶體空間為 1 的原因是:如果有其他的空物件,各自分配乙個記憶體空間可以讓兩者之間相互區別,而且 1 位元組也很省記憶體。 所以每個空物件都會有乙個自己的記憶體位址。
class person
;void test02()
int main()
因為 int 型別 ,不把之前的空型別考慮進去。
將person類改為
class person
;int person::m_b = 0;
非靜態成員變數 屬於類的物件上
靜態成員變數,不屬於類物件上
所以不考慮在內
class person
};int person::m_b = 0;
所以成員變數和成員函式是分開儲存的,非靜態成員函式不屬於類物件上
static voidfunc()
{}靜態成員函式也不會增加 不屬於類物件上
用於區分類中多個對www.cppcns.com象呼叫函式時,分別都是哪個函式在呼叫自己。
this 指標指向被呼叫成員函式所屬的物件
特點:1. this指標是隱含每乙個非靜態成員函式內的一種指標
2.this 指標不需要定義,直接使用即可。
用途:1.當形參和成員變數同名時,可用this指標來區分
2.在類的非靜態成員變數中返回物件本身,可使用return *this
class person
int age;
};void test01()
main()
如果不加 this 都會預設為形參 age ,從而報錯。
this 指向被呼叫的物件,此時為 p1。
class person
void personaddage(person &p)
int age;
};void test01()
//返回物件本身用*this
void test02()
int main()
此時p2為 20 ,若要多次相加需要改動為
class person
person& personaddage(person &p)//此處void 改為peroson是因為返回值如果是p2的話,就可以將p2.personaddage(p1) 看作p2,然後繼續呼叫之後的personaddage(p1)
//此處的person &p是以 引用的方式傳入
//此處的person& 是以引用的方式返回
int age;
};void test01()
//返回物件本身用*this
void test02()
int main()
鏈式程式設計思想:可以往後無限的追加。
但如果函式,不使用引用方法,返回的是乙個值,就會建立新的物件
person personaddage(person &p)//不使用引用方法
int age;
};在第一次呼叫person personaddage()後 ,p2加了10, 但在這之後返回的並不是本體了,而是根據本體建立的乙個新的資料。person 和 *this 是不一樣的資料(見拷貝建構函式的呼叫時機-以值方式返回區域性物件)。 所以每一次person personaddage()後,都是乙個新的物件,所以最後輸出結果p2 是不變的20。
疑問:至於為什麼不是p2 為 10 。 以值方式返回區域性物件會呼叫拷貝建構函式。對p2進行一次personaddage操作後,將p2的結果拷貝為p2' 。所以p2還是程式設計客棧經過了一次加年齡的操作的 。對p2進行一次personaddage操作後,將p2的結果拷貝為p2'
本文標題: c++物件模型和this指標詳解
本文位址: /ruanjian/c/433603.html
c 物件模型和this指標
1.成員變數和成員函式分開儲存 在c 中類內的成員變數和成員函式分開儲存,只有非靜態的成員變數才屬於類的物件上 c 編譯器會給每個空物件也分配乙個記憶體空間,是為了區分空物件佔記憶體的位置 this指標是隱含每乙個非靜態成員函式內的一種指標 this指標不需要定義,直接使用即可 this指標指向被呼...
c 物件模型和this指標
成員變數和成員函式分開儲存 類內的成員變數和成員函式分開儲存 只有非靜態成員變數才屬於類的物件上,靜態成員變數以及函式都不屬於物件 空物件占用記憶體空間為1 c 編譯器會給每隔空物件也分配乙個位元組空間,是為了區分空物件佔記憶體的位置 每個空物件也應該有乙個獨一無二的記憶體位址 this指標的概念 ...
C 物件模型和this指標
在c 中,類內的成員變數和成員函式分開儲存 只有非靜態成員變數才屬於類的物件上 include using namespace std 成員變數 和 成員函式 是分開儲存的 class person static void func2 靜態成員函式,不佔物件空間 int person m b 10 ...