gpt4 book ai didi

c++ - 为什么我可以从其他对象访问这个私有(private)成员?

转载 作者:行者123 更新时间:2023-12-01 14:42:57 24 4
gpt4 key购买 nike

我目前正在从 Stroustrup 的《编程:原理与实践》中学习 C++,并且有一个我无法真正理解的示例。有一个名为 Link 的类,看起来像这样。

class Link{

public:

Link(Link* p=nullptr, Link* n=nullptr, const std::string& label);
Link* erase();

private:
std::string label;
Link* succ;
Link* prev;

};


Link* Link::erase() {

if (this == nullptr) return nullptr;

if(prev) prev->succ = succ;
if(succ) succ->prev = prev;

return succ;


}

我不明白为什么 prev->succ = succ;是正确的,因为我从另一个对象分配给一个对象的私有(private)成员。我在这里想念什么?

最佳答案

访问是每个类而不是每个对象。如果按实例进行访问,许多事情将无法正常工作。例如这种类型

class foo {
int x;
};

有一个编译器生成的复制构造函数,它是这样的:
foo::foo(const foo& other) {
x = other.x;
}

访问限制用于封装,封装是为了确保不违反类不变量。但是,通常在方法内部会暂时违反不变量。例如考虑这个类
class Sum {
int a = 0;
int b = 0;
int sum = 0;
public:
void set(int x,int y);
int get_sum() { return sum; }
};

这里的不变量是 sum总是 a 的总和和 b .然而,在 set方法...
void Sum::set(int x,int y) {
a = x;
b = y;
sum = a + b;
}

这个不变量只在最后一行恢复。您有责任恢复不变量,使其从外部看来始终保持不变。

此外,访问限制是为了隐藏实现细节。在 Sum例如,用户不知道成员 sum存在,他们不需要知道。但是,类方法的定义处理了实现细节。处理不同对象的实现细节没有区别,因为它们是相同的。

和你的例子有什么关系?

访问限制的目的是让您确保从不违反外部不变量并隐藏实现细节。在 Link 的方法中你必须知道你在做什么。你要知道 prev是什么意思和 succ , 是否是 this 的成员或其他物体。该方法必须确保不违反不变量: 在调用 erase 之后调用者仍然有一个有效的 Link .为此,您正在处理实现细节:有效的 Linkprecsucc .

结论:无法访问其他对象的私有(private)方法将是一个主要障碍,并且不会真正带来优势(因为无论如何,在方法内部您已经在处理类的实现细节并且您经常暂时违反不变量)。

关于c++ - 为什么我可以从其他对象访问这个私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61542077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com