private data?

karlzheng 2009-05-11 12:59:26
class String
{
public:
String(const char *str = NULL);
String(const String &other);
~ String(void);

private:
char *m_data;
};


String::String(const String &other) // 3 分
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}

这是林锐书上的例子, strlen(other.m_data)可以直接访问private数据成员变量吗?
...全文
151 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sou2012 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
String::String(const String &other) // 3 分
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}


类的成员函数可以访问类或者类的实例里的private成员。
[/Quote]

UP
信念 2009-05-11
  • 打赏
  • 举报
回复
路过,规则的另一种形式
zhanghuayi_xiyou 2009-05-11
  • 打赏
  • 举报
回复
当然可以了,一位这是类的公有方法。
pengzhixi 2009-05-11
  • 打赏
  • 举报
回复
private 就是为了与外界隔离,所有外界的对它访问都得通过public的函数接口
surlover 2009-05-11
  • 打赏
  • 举报
回复
类的成员当然有权访问所有的类成员了
ysysbaobei 2009-05-11
  • 打赏
  • 举报
回复
papaofdoudou 2009-05-11
  • 打赏
  • 举报
回复
楼上已经很明白了,在补充一下,楼主产生这样的疑问可能是看到other.m_Data这样的引用私有数据成员的方式,因为有的时候这样写会产生编译错误,提示不能访问类的private数据成员,可是楼主可能没有注意,产生变异错误多半是因为把other.m_data这样的形式写在了类的外部,例如全局函数或者main函数下,而你所给的例子中other.m_data是写在了类的拷贝构造函数中,它是类的成员函数,对类的任何数据成员都有无限制的访问权,私有数据成员能否被访问,要看的并不是私有成员是如何被引用的,而是看是否在类的成员函数定义中,本类的成员函数可以访问本类的任意数据成员,所以说,不论你在当前类中如何引用i ,是采用this->i,或者还是 cong A&a; a.i的方式,都可以,编译器看到你写a.i的时候,判断出是在类的成员函数中定义的就不会抱错,相反,如果你在一个全局函数中a.i这样用的话,肯定会抱错,因为它已经不再类的范围内了。
总之一句话,私有数据成员能否被引用,看的不是调用它的是否是另外一个对象,而是此用法是否在类的定义内部。
例如,下面的代码分别在类内和类外使用了object.member的方式,一个地方产生编译错误,error C2248: 'a' : cannot access private member declared in class 'base'
C:\Documents and Settings\Administrator\桌面\85\1.cpp(7) : see declaration of 'a',另一个地方却没有问题:
#include <iostream>
using namespace std;

class base
{
private:
int a;
public:
base(int b)
{
a=b;
}
void set(base& ba)
{
a=ba.a;
cout<<ba.a<<endl; //虽然写成了ba.a(雷同other.m_data)但是确实在类的成员函数中,没有问题。
}
};

void func(base& ma)
{
cout<<ma.a<<endl; // 不允许在类外部访问私有变量。
}


void main()
{
base m(2);
base n(6);
m.set(n);
}
pathuang68 2009-05-11
  • 打赏
  • 举报
回复

String::String(const String &other) // 3 分
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}

上面这个函数,是String类的成员函数(拷贝构造函数,先不用管它,知道它是成员函数就OK了),一个类的成员函数是可以访问该类或该类实例中的所有成员变量的,包括private成员变量。

反过来想想:
如果一个类的成员函数不能访问该类的private成员变量,那还有什么可以访问这些private成员变量呢?很明显,没有什么可以访问(当然除友元函数外),既然如此,那么在一个类中设定private成员变量还有什么意义?当然没有意义。

如果有另外一个类SomeClass

SomeClass::SomeFunction()
{
String str = new String("abc");
int length = strlen(str.m_data); // NOT OK HERE!
}
  • 打赏
  • 举报
回复
String::String(const String &other) // 3 分
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}


类的成员函数可以访问类或者类的实例里的private成员。
jinye_kim 2009-05-11
  • 打赏
  • 举报
回复
可以

65,210

社区成员

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

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