有关深拷贝的一个疑问

depositpei 2008-05-21 08:22:20
class Student
{
public:
Student(char *pName);
Student(const Student& stu);
~Student();
private:
char *m_pcName;
};
Student::Student(char *pcName)
{
m_pcName = new char[strlen(pcName) + 1];
strcpy(m_pcName, pcName);
cout << "construct new student" <<endl;
}
Student::Student(const Student& stu){
//在这个深拷贝中 m_pcName是Student的private成员,为什么可以用stu.m_pcname来调用这个私有成员呢
//类的对象怎么能访问私有成员呢,但是它编译居然还通过了,
m_pcName = new char[strlen(stu.m_pcName) + 1];
strcpy(m_pcName, stu.m_pcName);
cout << "construct copy of" << stu.m_pcName <<endl;
}
...全文
257 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwong 2008-05-25
  • 打赏
  • 举报
回复
私有和保护成员只有类内部成员可以访问。而没有说这个对象的私有成员和保护成员不能被其他同类对象访问。
Vitin 2008-05-24
  • 打赏
  • 举报
回复
问题在于区分类和对象。成员函数是属于类的,而非属于某个对象。

所以成员函数的所有性质的标的物都是类,和特定对象无关。
比如访问权限,一定是针对某类(的所有对象)而言的,不可能发生可以访问某个对象、却不能访问另一个同类对象这种情况。
maple604 2008-05-23
  • 打赏
  • 举报
回复
因为是在本类中定义的。
kingsun555 2008-05-23
  • 打赏
  • 举报
回复
那是在类作用域中,能够访问类的任何成员(包括任何成员函数)。

类的PUBLIC,PROTECTED,PRIVATE 是针对于客户来说的,而不是类本身。
depositpei 2008-05-23
  • 打赏
  • 举报
回复
多谢大家这么热心的讨论,昨晚回去查了下C++primer也没找到答案,我个人觉得11楼的回答有点可能,我在类外加了测试函数
void Test(const Student &stu)
{
cout<<stu.m_pcName<<endl;
} 这个时候编译就报错了,错误信息为stu不能访问其私有成员,我想到这么一个结构
class test{

int Num;
test *Node;
}
在这个结构中Node->Num应该是正确的,那么在我的那个拷贝构造函数里Student::Student(const Student& stu)
stu作为Student类的一个引用,编译器很可能就把 stu看成是Student的一个private成员了,所以编译可以通过
bigeon 2008-05-23
  • 打赏
  • 举报
回复
好好看看书去。成员函数访问数据成员天经地义...
sukyin 2008-05-23
  • 打赏
  • 举报
回复
还是在作用范围内。
xdfd 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xkyx_cn 的回复:]
C/C++ code
Student::Student(const Student& stu){
//在这个深拷贝中 m_pcName是Student的private成员,为什么可以用stu.m_pcname来调用这个私有成员呢
//类的对象怎么能访问私有成员呢,但是它编译居然还通过了,
this->m_pcName = new char[strlen(stu.m_pcName) + 1];
strcpy(this->m_pcName, stu.m_pcName);
cout < < "construct copy of" < < stu.m_pcName < <endl;
}




为了说明问题来画蛇添足的补全…
[/Quote]
12楼说的不错,其实就是类的实做的问题,这个在构造过程中的操作都是内部的!
kgdiawpyu 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 kingsun555 的回复:]
那是在类作用域中,能够访问类的任何成员(包括任何成员函数)。

类的PUBLIC,PROTECTED,PRIVATE 是针对于客户来说的,而不是类本身。
[/Quote]

顶, 三种访问属性不针对类本身,只作用其它类和子类!
class A
{
public:
A() {};
} ;
class B
{
private:
B(){} ;
}

void test(void)
{
A a; // Ok
B b; //error 无法访问private成员
}
answerear 2008-05-22
  • 打赏
  • 举报
回复
类是自己类的友元,友员类的对象,那就肯定可以发问其私有成员了。
depositpei 2008-05-22
  • 打赏
  • 举报
回复
还是有点不太明白,类的成员函数可以访问自己的private成员我知道,这个Student的拷贝构造函数也算是类的成员函数,但是
Student::Student(const Student& stu){
他的参数就是类的引用,引用不就是变量的别名吗?那此处stu相当于是类的引用了,不就是个类的对象吗?怎么能访问他自己的pirvate成员呢?
lyle3 2008-05-22
  • 打赏
  • 举报
回复
学习下~
fallening 2008-05-22
  • 打赏
  • 举报
回复
即使不是该类的对象,用指针暴力传过去也是可以的
好像很多商业库头文件都是尽量把私有数据隐藏的,只给一个句柄,就是怕这个
比如

class C
{
private:
struct S;
S * handle;
public:
......
};

个人觉得这是相当恶心的做法
晨星 2008-05-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pc_fly 的回复:]
引用 7 楼 steedhorse 的回复:
只要是本类的函数,都可以访问。
其它类的函数当然不能访问,除非是友元。
访问控制机制是针对类而言的,还没有细化到对象身上。


星星说的略为欠妥当,实际上访问控制机制是先查对象的类,然后再根据类的访问控制设置去判断目标对象的访问是否合法。

对于楼主的这个问题我觉这样解释比较恰当:这么做是编译器的一个妥协,如果非要限定同类对象间的访问壁垒,那么实现copy构造函数…
[/Quote]
我认为绝不仅仅是copy构造函数。
还是12楼的说法更准确一些。
只要是该类的函数,都可以操纵该类的所有对象,有时是通过this来操纵,有时则通过别的对象、引用或指针来操纵。
晨星 2008-05-22
  • 打赏
  • 举报
回复
只要是本类的函数,都可以访问。
其它类的函数当然不能访问,除非是友元。
访问控制机制是针对类而言的,还没有细化到对象身上。
xkyx_cn 2008-05-22
  • 打赏
  • 举报
回复

Student::Student(const Student& stu){
//在这个深拷贝中 m_pcName是Student的private成员,为什么可以用stu.m_pcname来调用这个私有成员呢
//类的对象怎么能访问私有成员呢,但是它编译居然还通过了,
this->m_pcName = new char[strlen(stu.m_pcName) + 1];
strcpy(this->m_pcName, stu.m_pcName);
cout < < "construct copy of" < < stu.m_pcName < <endl;
}


为了说明问题来画蛇添足的补全一下这个函数,可见对成员的访问都是通过对象或指针的(static除外)
访问控制符是通过Student::来发生作用的

[Quote=引用 8 楼 depositpei 的回复:]
还是有点不太明白,类的成员函数可以访问自己的private成员我知道,这个Student的拷贝构造函数也算是类的成员函数,但是
Student::Student(const Student& stu){
他的参数就是类的引用,引用不就是变量的别名吗?那此处stu相当于是类的引用了,不就是个类的对象吗?怎么能访问他自己的pirvate成员呢?
[/Quote]
RocWay007 2008-05-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 steedhorse 的回复:]
只要是本类的函数,都可以访问。
其它类的函数当然不能访问,除非是友元。
访问控制机制是针对类而言的,还没有细化到对象身上。
[/Quote]

星星说的略为欠妥当,实际上访问控制机制是先查对象的类,然后再根据类的访问控制设置去判断目标对象的访问是否合法。

对于楼主的这个问题我觉这样解释比较恰当:这么做是编译器的一个妥协,如果非要限定同类对象间的访问壁垒,那么实现copy构造函数(重载赋值运算符)将非常麻烦,要么显式声明类是其自身的友元,要么为每个私有成员变量额外设置一个get函数。
leelittlelong 2008-05-22
  • 打赏
  • 举报
回复
如果类成员函数内部都不能访问私有成员
那私有成员就彻底没用了。。。
zyi1201 2008-05-21
  • 打赏
  • 举报
回复
因为是在类的内部
可以说本类是自己的友元类
lyle3 2008-05-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guanqb 的回复:]
那友元就是卧底了。。。
[/Quote]
这个...呵呵...
加载更多回复(4)

64,654

社区成员

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

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