我正在阅读一本 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 变量,因为它们是类的私有(private)成员。 我将向您展示类界面:
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作为引用值? 或者什么?
最佳答案
访问说明符是相对于类的,而不是该类的实例。 private
表示对类私有(private),而不是对该类型的对象私有(private)。也就是说,任何 string
类型的对象都可以访问任何其他 string
对象的 private
成员。
“这不会破坏封装吗?”我听到你哭了。实际上,不。如果您要更改该类的内部实现,我们倾向于通过会破坏的函数的数量来衡量类的封装。 string
的成员函数已经与私有(private)成员紧密耦合,因此允许访问同一类型的其他对象的私有(private)成员不会丢失封装。有关封装的更多信息,请阅读 “How Non-Member Functions Improve Encapsulation” .
我可能也想知道为什么 C++ 会像这样奇怪,但您可能会惊讶地发现在 Java、C# 和许多其他语言中也是如此。
关于c++ - 关于 C++ 中的访问说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202977/