C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量

除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量


/*************************************************************************
	> File Name: visit_private_data.cpp
	> Author: 
	> Mail: 
	> Created Time: 2016年03月21日 星期一 20时10分37秒
 ************************************************************************/

#include <iostream>
#include <string>
using namespace std;

class People{

    private:
        int num;
        int age;
        int hight;
        string name;
    public:
        People(){}
        People(int n, int a, int h, string na):num(n), age(a), hight(h), name(na){}
        ~People(){}

        int get_num(){return num;}
        int get_age(){return age;}
        int get_hight(){return hight;}
        string get_name(){return name;}
        
        void set_num(int val){num = val;}
        void set_age(int val){age = val;}
        void set_hight(int val){hight = val;}
        void set_name(string val){name = val;} 
};

int main()
{
    People p1(1, 22, 170, "linux");
    cout << "p1.num = " << p1.get_num() << endl;
    cout << "p1.age= " << p1.get_age() << endl;
    cout << "p1.hight = " << p1.get_hight() << endl;

    cout << "用地址访问类的私有成员变量: " << endl;
    int* p = (int*)&p1;
    cout << "*p = " << *p << endl;
    cout << "*(p+1) = " << *(p+1) << endl;
    cout << "*(p+2) = " << *(p+2) << endl;
    
    *p = 11;
    cout << "after *p = 11, *p = " << *p << endl;

    cout << "用地址输出类对象的前20个字节的值: " << endl;
    char* ptr = (char*)&p1;

    for(int i = 0; i < 20; ++i){
        cout << "*(ptr+" << i << ") = " << *(ptr+i) << endl;
    }


    return 0;
}

输出结果:

p1.num = 1
p1.age= 22
p1.hight = 170
用地址访问类的私有成员变量: 
*p = 1
*(p+1) = 22
*(p+2) = 170
after *p = 11, *p = 11
用地址输出类对象的前20个字节的值: 
*(ptr+0) = 

*(ptr+1) = 
*(ptr+2) = 
*(ptr+3) = 
*(ptr+4) = 
*(ptr+5) = 
*(ptr+6) = 
*(ptr+7) = 
*(ptr+8) = (ptr+9) = 
*(ptr+10) = 
*(ptr+11) = 
*(ptr+12) = 
*(ptr+13) = 
*(ptr+14) = 
*(ptr+15) = 
*(ptr+16) = (
*(ptr+17) = (ptr+18) = (ptr+19) = 

可以通过该测试例子得到类的基本成员变量在内存中的分布,但是还不能看到string name成员对象在该People类对象中的分布。以后肯定还会有其它的书籍会讲到。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值