C++编译器对属性和方法的处理机制
C++中的class從面向對象理論出發,將變量(屬性)和函數(方法)集中定義在一起,用于描寫敘述現實世界中的類。
從計算機的角度。程序依舊由數據段和代碼段構成。
C++編譯器怎樣完畢面向對象理論到計算機程序的轉化?
換句話:C++編譯器是怎樣管理類、對象、類和對象之間的關系
詳細的說:詳細對象調用類中的方法。那,c++編譯器是怎樣區分,是哪個詳細的類,調用這種方法?demo
#include <iostream>using namespace std;class C1 { public:int i; //4int j; //4int k; //4 protected: private: }; // 大小應該是12class C2 { public:int i; //4 int j; //4int k; //4static int m; //4 public:int getK() const { return k; } //4void setK(int val) { k = val; } //4protected: private: }; //大小可能是12,可能是16。可能是24 struct S1 {int i;int j;int k; }; // 大小是12struct S2 {int i;int j;int k;static int m; }; // 大小可能是12,可能是16int main() {printf("c1:%d \n", sizeof(C1)); // 結果是12printf("c2:%d \n", sizeof(C2)); // 結果是12printf("s1:%d \n", sizeof(S1)); // 結果是12printf("s2:%d \n", sizeof(S2)); // 結果是12}通過上面的demo。我們能夠的得出:
1)C++類對象中的成員變量和成員函數是分開存儲的
成員變量:
普通成員變量:存儲于對象中,與struct變量有同樣的內存布局和字節對齊方式
靜態成員變量:存儲于全局數據區中
成員函數:存儲于代碼段中。
問題出來了:非常多對象共用一塊代碼?代碼是怎樣區分詳細對象的?
換句話說:int getK() const { return k; },代碼是怎樣區分,詳細obj1、obj2、obj3對象的k值?
看下圖
對于普通成員函數。C++編譯器做了一層封裝。比方Test類的構造函數。當中盡管僅僅寫了一個參數i,但實際上就像右面結構體的初始化函數那樣,類的構造函數隱藏定義了一個this指針。
而靜態成員函數,不須要this指針,由于是共用的。對于類僅僅須要標注作用域就能夠了。
所以運行Test a(10); 就相當于 Test a; Test_initialize(%a, 10);其它的類似對照就懂了。
總結:
1、C++類對象中的成員變量和成員函數是分開存儲的。
C語言中的內存四區模型仍然有效!
2、C++中類的普通成員函數都隱式包括一個指向當前對象的this指針。
3、靜態成員函數、成員變量屬于類
靜態成員函數與普通成員函數的差別
靜態成員函數不包括指向詳細對象的指針
普通成員函數包括一個指向詳細對象的指針轉載于:https://www.cnblogs.com/yangykaifa/p/6876542.html
總結
以上是生活随笔為你收集整理的C++编译器对属性和方法的处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python发送邮件及附件
- 下一篇: 51单片机 | 中断系统概念及结构