C++怎么訪問私有變量和函數


用指針呀,了解C++內存結構的話。

 

1. 對於私有成員變量,可以用指針來訪問。

 

2. 對於虛函數,也可以用指針來訪問。

 

3. 另外,對於私有成員,如果摸不准地址構造,可以先構造一個結構相似的類,然后增加一個公有函數獲得內容,然后指針轉換,並且用公有函數來訪問。

#include <stdio.h>  
 
class A  
{  
private:  
    char *str;  
public:  
    A(): str("nothing"){};  
};  
 
class B  
{  
private:  
    char *str;  
public:  
    B(): str("nothing"){};  
    char *get()  
    {  
        return str;  
    }  
};  

 

4. 最后,就是直接定義一個相似的類,然后把私有變成公有,然后強轉指針來訪問。

但是注意,只對變量有效,對函數無效。

#include <vector>
#include <iostream>

using namespace std;

class A {
public:
    A(int i):a(i){}
private:
    void print() {cout<<"A"<<endl;}
    int a;
};

class B {
public:
    void print() {cout<<"B"<<endl;}
    int a;
};

int main() {

    A a(6);
    B *b = (B*)&a;
    b->print();
    cout << b->a << endl;

    return 0;
}

 

對於類函數(除了上面提到虛擬函數),想要訪問,其實就要知道代碼區的分布了吧。

 

那么A類的foo函數和B類的foo函數,如果參數列表一致,怎么區分它們呢?用A類的一個對象調用成員函數,這個成員函數用到成員變量,怎么知道是在用這個對象的數據呢?
這個解釋,就是this指針。A類的foo(int,int)函數,已經被編譯器編譯成_foo_A*_int_int,也就是說隱含已經加入了函數所屬類的信息,調用A類對象a.foo的時候,已經在調用foo(const A * this,int,int)這個函數。
這也解釋了,為什么在成員函數內部,使用成員變量,有時候(並不是全部情況下都如此)前面加this和不加this沒有區別,編譯器已經把foo里面用到的成員變量,用this指針指向了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM