在拷贝构造函数中为什么可以访问引用对象的私有变量?
例如: 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; } |
|
#1
得分:0
回复于:
2004-11-02 09:26:17
奇怪
|
|
#2
得分:0
回复于:
2004-11-02 09:32:06
私有是为了实现“对外”的信息隐藏,或者说保护,在类自己内部,有必要禁止私有变量的直接访问吗?难道还要让我们声明一个类为自身的友元?
|
|
#3
得分:0
回复于:
2004-11-02 09:42:08
freefalcon(心宇—小小菜鸟想高飞) :难道你的意思是说我随便定义类里面的一个函数,都可以用这个类的一个对象的这个函数访问这个类的另外一个对象的私有变量么?
|
|
#4
得分:0
回复于:
2004-11-02 09:43:36
呵呵,楼上说的是啊,私有的意思是什么啊?如果有一天你自己的东西自己都不能用了,那就不叫私有了,叫“他有”
|
|
#5
得分:0
回复于:
2004-11-02 09:46:04
Point::Point(Point &p)
{ X=p.X; //这在Point类中的Point函数内,所以没错。 Y=p.Y; } |
|
#6
得分:0
回复于:
2004-11-02 09:48:40
是的,在一个类的成员函数里面,可以访问该类另一个对象的私有成员
|
|
#7
得分:0
回复于:
2004-11-02 09:50:17
wildhorseych() :你我都是人类,你的钱我当然不能随便用了,是不是?我只是举个例子,没别的意思。不过我测试了一下,果然还是有问题呢
|
|
#8
得分:0
回复于:
2004-11-02 09:58:55
楼主请记住你是在定义你的类,不是在用
|
|
#9
得分:0
回复于:
2004-11-02 09:59:34
你的这个例子不对。
你需要注意的一点是:在这个类的成员函数中的任何操作是对于这个类的所有对象都起作用的,这实际上看起来有点象是嵌套,也就是说还没有产生任何对象的时候 已经定义了对对象的某些私有成员进行访问。但是,这种问题除了在拷贝构造函数出现以外一般不会使用。记着一点对于类来说,所有的对象都是我得实例,因此都 可以访问。 |
|
#10
得分:0
回复于:
2004-11-02 10:24:38
看来我以前的理解都是错的。
|
|
#11
得分:0
回复于:
2004-11-02 10:27:55
访问权限是对类而言的,不是对对象。
|
|
#12
得分:0
回复于:
2004-11-02 10:38:40
我想研究一下它的设计机制。
|
|
#13
得分:0
回复于:
2004-11-02 20:14:37
wildhorseych(),还是没有太明白,再解释的明白些好吗,这里很多人都想知道。
|
|
#14
得分:0
回复于:
2004-11-02 21:25:10
所谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同
对象不能访问。其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。
--------------------------------------------------------------- 私有的意思是其他类不可以访问, 所以它只可以被本类访问, 如果本类也不可以访问, 就不会被任何函数调用了。:) --------------------------------------------------------------- 结果很显然,如果不能访问,那么私有成员的存在就没有了意义。而对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的 操作。第一句话的解释,就是承认只有成员函数可以访问私有成员,这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。对于第二句 话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便?既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些 不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则 性。 --------------------------------------------------------------- 私有的权限不是对于类中的各个成员说的,所以本类的成员可以访问本类的私有成员,但是一个对象不是这个类的成员,所以不能访问私有成员,这就是为什么需要getxxx()接口的原因。 --------------------------------------------------------------- C++的封装是针对程序设计或作的,所以到达类的层次,而类的实例是运行状态,不再功能范畴之类,从使用角度来说,也无须这么做 |
|
#15
得分:0
回复于:
2004-11-02 21:39:18
确实是freefalcon(心宇—小小菜鸟想高飞) ( ) 说的这样
当一个函数想访问某个类的私有成员时,需要在要访问的这个类的定义中声明这个函数是它的友元. 而当这个函数就属于这个类本身的时候,自然就不用多此一举了. 就是说,一个对象的某个函数可以访问同一个类其他对象的私有成员.... |
|
#16
得分:0
回复于:
2004-11-02 21:50:12
如果在java中思路就再明显也不过了:
class Test{ private void mA(){ System.out.println("Test.mA()"); } public static void main(String[] args){ new Test().mA(); } } |
|
#17
得分:0
回复于:
2004-11-04 16:31:14
要是不能访问私有成员,拷贝构造函数怎么实现?
|
|
#18
得分:0
回复于:
2005-05-06 11:55:14
呵呵,是这样的啦。顺便说句,楼主不厚到,问题解决了也不结贴!!! 黑名单!
|
|
#19
得分:0
回复于:
2005-05-06 11:57:35
为方便编程.同类同象互为友元.
这个破坏封装.但是利于设计. |
|
#20
得分:0
回复于:
2005-05-06 12:16:27
楼上说得对!
|
|
#21
得分:0
回复于:
2005-05-06 12:53:15
这个是Bjarne Stroustrup这样设计的,原话见The C++ Programming Language P242
: "我对复制构造函数采用的是引用参数,这样做是必须的.复制构造函数定义了复制的意义 包含复制参数的意义,所以,写 complex::complex(complex c):re(c.re),im(c.im) {} 是个错误,因为这将会使任何调用都陷入无穷的递归." |