| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 337 人关注过本帖
标题:一个类成员访问问题
收藏  订阅  推荐  打印 
xzx1002002
Rank: 2
等级:注册会员
帖子:64
积分:790
注册:2006-3-7
一个类成员访问问题

下面是在百度知道发掘的一个挺有意思的问题。虽然实际中几乎不会这样来用。但是有助于深刻理解类成员的访问。

#include <iostream>
using namespace std;
class myclass{
int i;
public:
myclass(int s){i=s;}
myclass(){i=0;}
void xput(int test){i=test;}
void xget(){cout<<"i is "<<i<<"\n";}
void super_put(myclass t){i=t.i;}//直接访问了私有成员,还是用点访问的-_-
};
int main(){
myclass a,b;
int choice;
cout<<"直接访问私有成员变量测试开始……\n";
cout<<"请输入一个整数:";
cin>>choice;
a.xput(choice);
cout<<"a.xget() is ";
a.xget();
cout<<"b.xget() is ";
b.xget();
b.super_put(a);
cout<<"AFTER b.super_put(a)……\n";
cout<<"b.xget() is ";
b.xget();
return 0;
}

注意红色的一行。类对象直接访问了类的私有函数。大家可以讨论一下,这里为什么可以这样来用。
搜索更多相关主题的帖子: 类成员  百度  int  myclass  
2008-8-11 13:57
xzx1002002
Rank: 2
等级:注册会员
帖子:64
积分:790
注册:2006-3-7

我认为,
只要是在成员函数和友元中就可以直接访问该类的私有成员变量,无论类的对象是谁。
所以,访问类的私有成员变量的权限是相对于访问它的地方的,而不是类的对象。
2008-8-11 15:30
elegant87
Rank: 2
等级:注册会员
帖子:49
积分:667
注册:2008-1-15

类的成员函数可以直接访问类的私有成员的。
2008-8-11 16:41
中学者
Rank: 12Rank: 12Rank: 12
等级:版主
威望:11
帖子:3376
积分:34542
注册:2007-9-14

........两个i明显不一样-,-

汇编.....
2008-8-11 19:24
中学者
Rank: 12Rank: 12Rank: 12
等级:版主
威望:11
帖子:3376
积分:34542
注册:2007-9-14

数据成员的地址是对象地址加上数据成员在类中的偏移量-1....所以两个i的地址是不一样的.

汇编.....
2008-8-11 19:25
xlh5225
Rank: 2
等级:注册会员
帖子:141
积分:1630
注册:2007-8-14

当然可以!有问题?
2008-8-11 19:56
xzx1002002
Rank: 2
等级:注册会员
帖子:64
积分:790
注册:2006-3-7

问题是两个i明显不一样,但是为什么都可以直接访问。
2008-8-12 09:15
thames
Rank: 1
等级:新手上路
帖子:7
积分:172
注册:2008-8-12

我想用剥洋葱的方法把程序还原就比较直观了
2008-8-12 13:04
zerocn
Rank: 2
等级:注册会员
帖子:124
积分:1458
注册:2006-4-11

是可以的,一个类的成员函数可以访问同类的不同对象的成员
类似的,
1.派生类的成员函数可以访问同一个派生类的不同对象的基类子对象的protected成员
2.派生类的成员函数可以访问同一个派生类的不同对象的protected 和private成员



#include <iostream>
#include <stdlib.h>
#include <string>


using namespace std;
class base
{public:
base():base_value(0){}   
protected:
int base_value;
};


class dervied:public base
{
public:
dervied():dervied_value(0){}
void show(const dervied &obj){cout<<"base::base_balue:"<<obj.base_value<<endl
                              <<"dervied::dervied_value:"<<obj.dervied_value;}
private:
int dervied_value;     
};


using namespace std;


int main()
{
    dervied A,B;
    A.show(B);
    system("pause");   
    return 0;
}
2008-8-12 18:13
jimn1982
Rank: 1
等级:新手上路
帖子:3
积分:140
注册:2008-8-14
通俗理解

通俗理解是对象的数据和函数的代码是分开的.同类的对象公用函数的代码部分.所以只要传递进去的对象是同一个类实例化的.函数都可以访问.
2008-8-14 10:25
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.138563 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved