对象的引用作为参数,可以直接访问私有成员??

sicofield 2013-05-24 02:12:40
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);

CMyString& operator = (const CMyString& str);

void Print();

private:
char* m_pData;
};


CMyString::CMyString(const CMyString &str)
{
int length = strlen(str.m_pData);
m_pData = new char[length + 1];
strcpy(m_pData, str.m_pData);
}


如代码所示此时str为什么可以直接访问私有成员??
...全文
746 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶之舟 2013-05-27
  • 打赏
  • 举报
回复
引用 6 楼 sicofield 的回复:
[quote=引用 3 楼 ochonglangzheo 的回复:] C++的限定符是限定类的,不是限定对象的,只要是类型相同就能相互访问。两个是同类型的,因此可以直接访问,但是需要指定一下是哪个对象。所 谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同对 象不能访问。 其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。 对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的操作。第一句话的解释,就是承认只有成员函数可以访问私有成员, 这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。对于第二句话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便? 既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中 访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则性。
引用 4 楼 hugett 的回复:
这个跟对象的引用没有关系吧。。主要是因为
CMyString(char* pData = NULL);
是类的成员函数。。成员函数中无论public还是private的成员都是可以访问的。。 你定义一个非成员非友元函数再用类对象作为参数。。就不能访问私有成员了。。
引用 5 楼 dahuaixiaohuai 的回复:
在类自己的成员函数中当然可以访问所有的成员变量,包括私有的。如果是其它类的对象就不可以访问它的私有成员了。
这里我关键不明白的是,的确是类的成员函数,但是参数(对象)并不是调用该成员函数的对象。 是不是可以这么认为,在类的成员函数之中,无论调用者是谁,都可以直接访问所有该类对象的私有成员(如果此对象以参数形式传入)[/quote] 没错,同一个类中确是如此。
hugett 2013-05-24
  • 打赏
  • 举报
回复
你可以这么认为
sicofield 2013-05-24
  • 打赏
  • 举报
回复
引用 3 楼 ochonglangzheo 的回复:
C++的限定符是限定类的,不是限定对象的,只要是类型相同就能相互访问。两个是同类型的,因此可以直接访问,但是需要指定一下是哪个对象。所 谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同对 象不能访问。 其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。 对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的操作。第一句话的解释,就是承认只有成员函数可以访问私有成员, 这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。对于第二句话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便? 既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中 访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则性。
引用 4 楼 hugett 的回复:
这个跟对象的引用没有关系吧。。主要是因为
CMyString(char* pData = NULL);
是类的成员函数。。成员函数中无论public还是private的成员都是可以访问的。。 你定义一个非成员非友元函数再用类对象作为参数。。就不能访问私有成员了。。
引用 5 楼 dahuaixiaohuai 的回复:
在类自己的成员函数中当然可以访问所有的成员变量,包括私有的。如果是其它类的对象就不可以访问它的私有成员了。
这里我关键不明白的是,的确是类的成员函数,但是参数(对象)并不是调用该成员函数的对象。 是不是可以这么认为,在类的成员函数之中,无论调用者是谁,都可以直接访问所有该类对象的私有成员(如果此对象以参数形式传入)
一叶之舟 2013-05-24
  • 打赏
  • 举报
回复
在类自己的成员函数中当然可以访问所有的成员变量,包括私有的。如果是其它类的对象就不可以访问它的私有成员了。
hugett 2013-05-24
  • 打赏
  • 举报
回复
这个跟对象的引用没有关系吧。。主要是因为
CMyString(char* pData = NULL);
是类的成员函数。。成员函数中无论public还是private的成员都是可以访问的。。 你定义一个非成员非友元函数再用类对象作为参数。。就不能访问私有成员了。。
ochonglangzheo 2013-05-24
  • 打赏
  • 举报
回复
C++的限定符是限定类的,不是限定对象的,只要是类型相同就能相互访问。两个是同类型的,因此可以直接访问,但是需要指定一下是哪个对象。所 谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同对 象不能访问。 其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。 对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的操作。第一句话的解释,就是承认只有成员函数可以访问私有成员, 这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。对于第二句话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便? 既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中 访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则性。
zybjtu 2013-05-24
  • 打赏
  • 举报
回复
首先这是一种规定,不如此的话,构造函数该怎么写。这是c++对象模型的一部分,二来,这个工作是交给编译器做的。这是c++的语言特点。
sicofield 2013-05-24
  • 打赏
  • 举报
回复
上面有点小错误,重新发一下
class CMyString
{
public:
    CMyString(char* pData = NULL);
    CMyString(const CMyString& str);
    ~CMyString(void);

    CMyString& operator = (const CMyString& str);

    void Print();
      
private:
    char* m_pData;
};


CMyString::CMyString(const CMyString &str)
{
    int length = strlen(str.m_pData);
    m_pData = new char[length + 1];
    strcpy(m_pData, str.m_pData);
}

64,637

社区成员

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

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