关于private的一点疑惑

leequnwan 2006-10-08 12:33:14
#include<iostream>
using namespace std;

enum{ Larger, Smaller, Same};

class Data
{
public:
Data(int val):itsValue(val){ }
~Data( ){ cout << "Data deleting..\n"; }

int compare(const Data &);
void show( ){ cout << "Value: " << itsValue << endl; }
private:
int itsValue;
};

int Data::compare(const Data & rhs)
{
if(itsValue > rhs.itsValue) /////..........
return Larger;
else if(itsValue == rhs.itsValue) /////...........
return Same;
else
return Smaller;
}

int main( )
{
Data data1(1);
Data data2(2);
cout << data1.compare(data2) << endl;
return 0;
}
我想问的是既然itsValue是Data的私有数据,为什么在compare(const Data &)这个函数就可以使用点操作符来访问itsValue(data2.itsValue)呢?按书上说的话,这个程序应该不能通过编译的,可是居然通过了,究竟是怎么一回事?
...全文
358 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw1a2 2006-10-08
  • 打赏
  • 举报
回复
回帖晚了,楼层错了

jixingzhong和chenhu_doc一起解释一下吧:)
lw1a2 2006-10-08
  • 打赏
  • 举报
回复
楼上解释一下,为什么在派生类里面,只能访问自己基类的protected成员(从深层意义上)?如:

#include <iostream>
using namespace std;

class B
{
protected:
int i;
};

class D : public B
{
public:
void f1(B &b){i;}//OK
void f2(B &b){b.i;}//Error
};

int main()
{
system("pause");
}

chenhu_doc 2006-10-08
  • 打赏
  • 举报
回复
成员变量在class作用域中, 成员函数操作作用域中的变量是可以的。

还有一种解释 : 成员也是友元。(可以直接操作private成员)
jixingzhong 2006-10-08
  • 打赏
  • 举报
回复
data1 data2 都是 Data 类型,
Data 类型数据都是 Data 类型数据的友元,
(所以 data2 和 data1 互为友元)
友元自然是可以访问私有成员的 ...
jixingzhong 2006-10-08
  • 打赏
  • 举报
回复
因为自己是自己的 友元
leequnwan 2006-10-08
  • 打赏
  • 举报
回复
想想还是OOPhaisky(异化$渴望成功~~) 和steedhorse(晨星) 说得比较通俗易懂,的确我把概念给理解错了,只要是在同一类的函数中(不管是不是本对象的),该类的具体某个对象都可以访问自己的成员,不管它是public还是private。
其实大家的答案都很好,可惜分数不够花,所以难免给不了一部分人分数。
谢谢大家的解答。
晨星 2006-10-08
  • 打赏
  • 举报
回复
根据“访问权限”的含义,显然,类的成员函数不仅仅可以访问当前的this指针所指向的那个对象的成员,也可访问该类的所有其它对象实例的成员——只要那个对象对它可见,而不管这个对象是全局的,还是局部的(函数的形式参数也可看成局部变量的一种)。
晨星 2006-10-08
  • 打赏
  • 举报
回复
不管什么书,应该从来不会说“一个对象不可以访问另一个对象的私有成员”这种话吧。
而只可能说“私有成员不可以从类的外部访问”,注意,人家说的是“类的外部”,而非“对象的外部”,这两者当然不一样。
CHROX 2006-10-08
  • 打赏
  • 举报
回复
我个人认为private(私用部分)变量,只能由成员函数使用。this->itsValue;只是使用this指针来获取相应对象的成员,private变量的使用权还只在成员函数手里。同样如果不在成员函数中,比如在main()中,使用data2.itsValue编译器不会让你获取该对象的成员,更不用说使用了。
CHROX 2006-10-08
  • 打赏
  • 举报
回复
请解释何为“访问”?

rhs.itsValue; this->itsValue; data2.itsValue;

只有在成员函数中可以使用上述语句,那么访问者究竟是谁?是data2还是成员函数?
taodm 2006-10-08
  • 打赏
  • 举报
回复
楼主,你按的是哪本书?
去看c++ primer 3e P514
lw1a2 2006-10-08
  • 打赏
  • 举报
回复
感觉从友元角度来理解,有点怪异
OOPhaisky 2006-10-08
  • 打赏
  • 举报
回复
我想问的是既然itsValue是Data的私有数据,为什么在compare(const Data &)这个函数就可以使用点操作符来访问itsValue(data2.itsValue)呢?
-----------------------------------------------------------------------------
因为compare是class Data的成员函数,而在成员函数中是完全可以访问私有成员的。
楼主可能会认为“成员函数中只能访问[本对象]的私有成员”,按照这种说法,上面的compare就是非法的了,因为rhs.itsValue是另一个class Data对象的私有成员。
但是遗憾的是,这种想法是错的,[本对象]和[其他对象]中的私有成员都可以访问,只要是class Data类型就可以了。
楼主可以这样理解,即使是成员函数,也是通过隐式this指针来访问成员的,即:
int compare(Data *const this, const Data & rhs)//注意隐式的this参数
{
if(this->itsValue > rhs.itsValue)
return Larger;
else if(this->itsValue == rhs.itsValue)
return Same;
else
return Smaller;
}
这样看来,this->itsValue和rhs.itsValue就是[平等]的了,那么既然this->itsValue是被允许的,那么rhs.itsValue也理所应当是被允许的。
chenhu_doc 2006-10-08
  • 打赏
  • 举报
回复
void f1(B &b){i;} //this指针在作用域中引用自己的成员。
void f2(B &b){b.i;} //b对象则不然。


友元是不可传递的。

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧