我正在阅读一本C ++手册,并在关于创建自定义字符串类的章节中我参与了此代码:
string& string::operator = (const string& Str)
{
char* temp = new char[Str.m_Length];
m_Length = Str.m_Length;
memcpy(temp,Str.m_Data,m_Length);
delete [ ] m_Data;
m_Data = temp;
return *this;
}
它是关于复制构造函数的实现。 一切正常,我不能抱怨它的效率,但我没有得到的是如何从Str字符串中读取m_Length和m_Data变量,因为它们是类的私有成员。 我将向您展示类接口:
class string
{
public:
string();
string (const string& Str);
string& operator = (const string& Str);
~string();
string(char* p);
private:
short m_Length;
char* m_Data;
};
这是可能的,因为我们在函数中调用了Str作为参考值吗? 或者是什么?
答案 0 :(得分:2)
访问说明符是相对于类的,而不是该类的实例。 private
表示类的私有,而不是该类对象的私有。也就是说,string
类型的任何对象都可以访问任何其他private
对象的string
成员。
“这不会破坏封装吗?”我听到你哭了。实际上,没有。我们倾向于通过在您更改该类的内部实现时会破坏的函数数量来测量类的封装。 string
的成员函数已经与私有成员紧密耦合,因此不允许通过允许访问相同类型的其他对象的私有成员来丢失封装。有关封装的更多信息,请阅读“How Non-Member Functions Improve Encapsulation”。
我可能也想知道为什么C ++会像这样奇怪,但你可能会惊讶地发现在Java,C#和许多其他语言中也是如此。