社区
C++ 语言
帖子详情
在拷贝构造函数中为什么可以访问引用对象的私有变量?
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;
}
...全文
1239
21
打赏
收藏
在拷贝构造函数中为什么可以访问引用对象的私有变量?
在拷贝构造函数中为什么可以访问引用对象的私有变量? 例如: 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; }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
300道C++题目
300道C++题目
拷贝构造函数
为何可以调用
引用
参数
对象
的
私有
成员?
拷贝构造函数
为何可以调用
引用
参数
对象
的
私有
成员?
例如 String(const String &other) { m_data=other.x;//x是String类的
私有
成员 } 可以。 因为
拷贝构造函数
是放在本身这个类里的,而类
中
的函数可以
访问
这个类的
对象
的所有成员,当然包括
私有
成员了。 String(const String &other) { m_data=other.x;//x是String类的
私有
成员 }
引用
参数
对象
也是Stri
为什么C++
中
复制构造函数可以
访问
参数
对象
的
私有
成员
私有
成员
变量
的概念,在脑海
中
的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在
对象
外部
访问
对象
的
私有
成员
变量
. 然而,在实现
拷贝构造函数
和赋值符函数时,在函数里利用
对象
直接
访问
了
私有
成员
变量
,因而,产生了困惑.下面以具体实例进行说明: 疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? class CTest { public: ...
为什么
拷贝构造函数
的参数可以直接去
访问
它自己的
私有
成员?关于
对象
不能直接
访问
私有
成员的超级大误区~
我们先来看一个例子 #include using namespace std; class CPoint { public: CPoint(int xx, int yy) { x = xx; y = yy; } CPoint(const CPoint &p):x(p.x),y(p.y) <===这里的复制构造函数
对象
p竟然能...
类
对象
的
私有
数据是无法被直接
访问
的,但是为什么在复制构造函数
中
,可以直接通过
引用
访问
被复制
对象
的
私有
数据?
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + S
C++ 语言
65,174
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章