在拷贝构造函数中为什么可以访问引用对象的私有变量?

bakerk 2004-11-02 09:21:08
在拷贝构造函数中为什么可以访问引用对象的私有变量?
例如:
class Point
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;}
Point(Point &p);
private:
int X,Y;
};
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
}
...全文
1178 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
astrophor 2005-05-06
  • 打赏
  • 举报
回复
这个是Bjarne Stroustrup这样设计的,原话见The C++ Programming Language  P242

"我对复制构造函数采用的是引用参数,这样做是必须的.复制构造函数定义了复制的意义
 包含复制参数的意义,所以,写
 complex::complex(complex c):re(c.re),im(c.im) {}
是个错误,因为这将会使任何调用都陷入无穷的递归."
healer_kx 2005-05-06
  • 打赏
  • 举报
回复
楼上说得对!
du51 2005-05-06
  • 打赏
  • 举报
回复
为方便编程.同类同象互为友元.
这个破坏封装.但是利于设计.
homtipo 2005-05-06
  • 打赏
  • 举报
回复
呵呵,是这样的啦。顺便说句,楼主不厚到,问题解决了也不结贴!!! 黑名单!
lious 2004-11-04
  • 打赏
  • 举报
回复
要是不能访问私有成员,拷贝构造函数怎么实现?
mxk130 2004-11-02
  • 打赏
  • 举报
回复
我想研究一下它的设计机制。
关门兔 2004-11-02
  • 打赏
  • 举报
回复
访问权限是对类而言的,不是对对象。
mxk130 2004-11-02
  • 打赏
  • 举报
回复
看来我以前的理解都是错的。
wildhorseych 2004-11-02
  • 打赏
  • 举报
回复
你的这个例子不对。
你需要注意的一点是:在这个类的成员函数中的任何操作是对于这个类的所有对象都起作用的,这实际上看起来有点象是嵌套,也就是说还没有产生任何对象的时候已经定义了对对象的某些私有成员进行访问。但是,这种问题除了在拷贝构造函数出现以外一般不会使用。记着一点对于类来说,所有的对象都是我得实例,因此都可以访问。

qiqi162002 2004-11-02
  • 打赏
  • 举报
回复
楼主请记住你是在定义你的类,不是在用
mxk130 2004-11-02
  • 打赏
  • 举报
回复
wildhorseych() :你我都是人类,你的钱我当然不能随便用了,是不是?我只是举个例子,没别的意思。不过我测试了一下,果然还是有问题呢
javafaq2004 2004-11-02
  • 打赏
  • 举报
回复
如果在java中思路就再明显也不过了:

class Test{
private void mA(){
System.out.println("Test.mA()");
}
public static void main(String[] args){
new Test().mA();
}
}
freefalcon 2004-11-02
  • 打赏
  • 举报
回复
是的,在一个类的成员函数里面,可以访问该类另一个对象的私有成员
grooving 2004-11-02
  • 打赏
  • 举报
回复
Point::Point(Point &p)
{
X=p.X; //这在Point类中的Point函数内,所以没错。
Y=p.Y;
}
wildhorseych 2004-11-02
  • 打赏
  • 举报
回复
呵呵,楼上说的是啊,私有的意思是什么啊?如果有一天你自己的东西自己都不能用了,那就不叫私有了,叫“他有”
mxk130 2004-11-02
  • 打赏
  • 举报
回复
freefalcon(心宇—小小菜鸟想高飞) :难道你的意思是说我随便定义类里面的一个函数,都可以用这个类的一个对象的这个函数访问这个类的另外一个对象的私有变量么?
sonic_andy 2004-11-02
  • 打赏
  • 举报
回复
确实是freefalcon(心宇—小小菜鸟想高飞) ( ) 说的这样
当一个函数想访问某个类的私有成员时,需要在要访问的这个类的定义中声明这个函数是它的友元.
而当这个函数就属于这个类本身的时候,自然就不用多此一举了.
就是说,一个对象的某个函数可以访问同一个类其他对象的私有成员....
freefalcon 2004-11-02
  • 打赏
  • 举报
回复
私有是为了实现“对外”的信息隐藏,或者说保护,在类自己内部,有必要禁止私有变量的直接访问吗?难道还要让我们声明一个类为自身的友元?
mxk130 2004-11-02
  • 打赏
  • 举报
回复
奇怪
xMars 2004-11-02
  • 打赏
  • 举报
回复
所谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同对象不能访问。其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。
---------------------------------------------------------------

私有的意思是其他类不可以访问,
所以它只可以被本类访问,
如果本类也不可以访问,
就不会被任何函数调用了。:)
---------------------------------------------------------------

结果很显然,如果不能访问,那么私有成员的存在就没有了意义。而对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的操作。第一句话的解释,就是承认只有成员函数可以访问私有成员,这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。对于第二句话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便?既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则性。
---------------------------------------------------------------

私有的权限不是对于类中的各个成员说的,所以本类的成员可以访问本类的私有成员,但是一个对象不是这个类的成员,所以不能访问私有成员,这就是为什么需要getxxx()接口的原因。
---------------------------------------------------------------

C++的封装是针对程序设计或作的,所以到达类的层次,而类的实例是运行状态,不再功能范畴之类,从使用角度来说,也无须这么做
加载更多回复(1)

64,683

社区成员

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

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