c++ - 关于 C++ 中的访问说明符

标签 c++ class

我正在阅读一本 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/

相关文章:

c++ - 尝试通过 .h 和 .cpp 文件设置类——为什么会出现这些错误?

javascript - JavaScript 如何创建与 DOM 元素的单向数据绑定(bind)?

c++ - 指向类族中各种类型的指针的限制?

c++ - 调用静态方法

c++ - 在对象被显式销毁但在其内存被释放之前调用成员函数是否合法?

c++ - 柠檬解析器 - 如何处理柠檬解析器的结果

java - Java 中的内部类 - 非静态变量错误

vba - 如何使类变量在VBA中的模块之间持久存在

c++ - 无法在 Ubuntu 的 QtCreator 中将 glfw 与 CMake 链接

c++ - 模板参数隐藏