在拷贝构造函数中为什么可以访问引用对象的私有变量? [问题点数:0分]


在拷贝构造函数中为什么可以访问引用对象的私有变量?
例如:
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;
}

更多
0

分享到:

相关主题推荐:
对象
class
yy
x

相关帖子推荐:

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

回复次数:21

mxk130

mxk130
本版等级:

#1
得分:0

回复于:
2004-11-02 09:26:17

奇怪

对我有用[1]
丢个板砖[0]
引用 |
举报 |

管理

freefalcon

freefalcon
本版等级:


#2
得分:0

回复于:
2004-11-02 09:32:06

私有是为了实现“对外”的信息隐藏,或者说保护,在类自己内部,有必要禁止私有变量的直接访问吗?难道还要让我们声明一个类为自身的友元?

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

mxk130

mxk130
本版等级:

#3
得分:0

回复于:
2004-11-02 09:42:08

freefalcon(心宇—小小菜鸟想高飞) :难道你的意思是说我随便定义类里面的一个函数,都可以用这个类的一个对象的这个函数访问这个类的另外一个对象的私有变量么?

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

wildhorseych

wildhorseych
本版等级:

#4
得分:0

回复于:
2004-11-02 09:43:36

呵呵,楼上说的是啊,私有的意思是什么啊?如果有一天你自己的东西自己都不能用了,那就不叫私有了,叫“他有”

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

grooving

grooving
本版等级:

#5
得分:0

回复于:
2004-11-02 09:46:04

Point::Point(Point &p)
{
        X=p.X; //这在Point类中的Point函数内,所以没错。
        Y=p.Y;
}

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

freefalcon

freefalcon
本版等级:


#6
得分:0

回复于:
2004-11-02 09:48:40

是的,在一个类的成员函数里面,可以访问该类另一个对象的私有成员

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

mxk130

mxk130
本版等级:

#7
得分:0

回复于:
2004-11-02 09:50:17

wildhorseych() :你我都是人类,你的钱我当然不能随便用了,是不是?我只是举个例子,没别的意思。不过我测试了一下,果然还是有问题呢

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

qiqi162002

qiqi162002
本版等级:

#8
得分:0

回复于:
2004-11-02 09:58:55

楼主请记住你是在定义你的类,不是在用

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

wildhorseych

wildhorseych
本版等级:

#9
得分:0

回复于:
2004-11-02 09:59:34

你的这个例子不对。
你需要注意的一点是:在这个类的成员函数中的任何操作是对于这个类的所有对象都起作用的,这实际上看起来有点象是嵌套,也就是说还没有产生任何对象的时候
已经定义了对对象的某些私有成员进行访问。但是,这种问题除了在拷贝构造函数出现以外一般不会使用。记着一点对于类来说,所有的对象都是我得实例,因此都
可以访问。

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

mxk130

mxk130
本版等级:

#10
得分:0

回复于:
2004-11-02 10:24:38

看来我以前的理解都是错的。

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

ElleLang

ElleLang
本版等级:

#11
得分:0

回复于:
2004-11-02 10:27:55

访问权限是对类而言的,不是对对象。

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

mxk130

mxk130
本版等级:

#12
得分:0

回复于:
2004-11-02 10:38:40

我想研究一下它的设计机制。

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

bakerk

bakerk
本版等级:

#13
得分:0

回复于:
2004-11-02 20:14:37

wildhorseych(),还是没有太明白,再解释的明白些好吗,这里很多人都想知道。

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

xMars

xMars
本版等级:

#14
得分:0

回复于:
2004-11-02 21:25:10

所谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同
对象不能访问。其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。  
---------------------------------------------------------------  
 
私有的意思是其他类不可以访问,  
所以它只可以被本类访问,  
如果本类也不可以访问,  
就不会被任何函数调用了。:)  
---------------------------------------------------------------  
 
结果很显然,如果不能访问,那么私有成员的存在就没有了意义。而对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的
操作。第一句话的解释,就是承认只有成员函数可以访问私有成员,这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。对于第二句
话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便?既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些
不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则
性。  
---------------------------------------------------------------  
 
私有的权限不是对于类中的各个成员说的,所以本类的成员可以访问本类的私有成员,但是一个对象不是这个类的成员,所以不能访问私有成员,这就是为什么需要getxxx()接口的原因。  
---------------------------------------------------------------  
 
C++的封装是针对程序设计或作的,所以到达类的层次,而类的实例是运行状态,不再功能范畴之类,从使用角度来说,也无须这么做

对我有用[3]
丢个板砖[0]
引用 |
举报 |

管理

sonic_andy

sonic_andy
本版等级:

#15
得分:0

回复于:
2004-11-02 21:39:18

确实是freefalcon(心宇—小小菜鸟想高飞) ( ) 说的这样
当一个函数想访问某个类的私有成员时,需要在要访问的这个类的定义中声明这个函数是它的友元.
而当这个函数就属于这个类本身的时候,自然就不用多此一举了.
就是说,一个对象的某个函数可以访问同一个类其他对象的私有成员....

对我有用[1]
丢个板砖[0]
引用 |
举报 |

管理

javafaq2004

javafaq2004
本版等级:


#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();
  }
}

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

lious

lious
本版等级:

#17
得分:0

回复于:
2004-11-04 16:31:14

要是不能访问私有成员,拷贝构造函数怎么实现?

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

homtipo

homtipo
本版等级:

#18
得分:0

回复于:
2005-05-06 11:55:14

呵呵,是这样的啦。顺便说句,楼主不厚到,问题解决了也不结贴!!! 黑名单!

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

du51

du51
本版等级:


#19
得分:0

回复于:
2005-05-06 11:57:35

为方便编程.同类同象互为友元.
这个破坏封装.但是利于设计.

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

healer_kx

healer_kx
本版等级:


#20
得分:0

回复于:
2005-05-06 12:16:27

楼上说得对!

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

SaiRose

astrophor
本版等级:

#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) {}
是个错误,因为这将会使任何调用都陷入无穷的递归."

时间: 2024-10-07 08:13:15

在拷贝构造函数中为什么可以访问引用对象的私有变量? [问题点数:0分]的相关文章

小鱼提问3 static方法中可以访问某个类的私有变量吗(不通过反射的其他非正常手段)?什么情况下可以?

? 1 2 3 4 5 6 7 8 9 10 11 12 class Student {     private string _name;     public int Age = 0;     public static void Test()     {         Student stu = new Student();         <span style="color: rgb(255, 0, 0);"><strong>stu._name =

通过指针访问C++对象的私有成员

C++对象的私有成员是禁止类外的访问的.但是我们仍然可以通过指针访问C++对象的私有成员. #include <iostream> using namespace std; class A { public: A(int i = 0) :m_i(i) {} void print() { cout << "m_i" << this->m_i << endl; } private: int m_i; }; int main(int ar

Java访问子类对象的实例变量

对于Java这正语言来说,一般来说,子类可以调用父类中的非private变量,但在一些特殊情况下, Java语言可以通过父类调用子类的变量 具体的还是请按下面的例子吧! package com.yonyou.test; /** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */ class Base { // 定义了一个名为i的实例变量 private int i = 2; public Base() { this.display(); //注意这里面的this代表当前

C++拷贝构造函数(浅拷贝、深拷贝)

下面举一个简单的例子说明对象之间的拷贝(此例中没有自定义拷贝构造函数,在调用拷贝构造函数的时候,编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝)浅拷贝: #include<iostream> using namespace std; class CExample { private:int a; public: CExample(int b) { a=b; } void Show() { cout<<a<<endl; } }; int main(

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

《C++编程思想》 第十章 引用和拷贝构造函数(知识点+习题+解答)

一.相关知识点 使用引用时有一定的规则: 1) 当引用被创建时,它必须被初始化.(指针则可以在任何时候被初始化.) 2) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用.(指针则可以在任何时候指向另一个对象.) 3) 不可能有NULL引用.必须确保引用是和一块合法的存储单元关连. 仅当准备用传值的方式传递类对象时,才需要拷贝构造函数.如果不需要这么做,就不要拷贝构造函数. 对于指向一个对象的指针新的语法变为 ->*,对于一个对象或引用则为.*. 二.相关代码 1. /*R

拷贝构造函数的参数类型必须是引用

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答.不过还好,我思索一下以后,发现这个答案是不对的. 原因:       如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),

C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?

之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导致栈溢出. 下面来看一个例子: class test { public: test() { cout << "constructor with argument\n"; } ~test() { } test(test& t) { cout << "

c++中 拷贝构造函数的深拷贝和浅拷贝--“浅拷贝”与“深拷贝”

C++中对象的复制就如同"克隆",用一个已有的对象快速地复制出多个完全相同的对象.一般而言,以下三种情况都会使用到对象的复制: (1)建立一个新对象,并用另一个同类的已有对象对新对象进行初始化,例如: class Rect { private: int width; int height; }; Rect rect1; Rect rect2(rect1); // 使用rect1初始化rect2,此时会进行对象的复制 (2)当函数的参数为类的对象时,这时调用此函数时使用的是值传递,也会产