0

这不会破坏封装吗?

乙:

class B{
    int x, y;
public:
    B() : x(1), y(1) {}
    B(const B& obj) : x(obj.x), y(obj.y) {}

    int getx();
    int gety();

    friend void pass_private_members(B&);
};

B.cpp

void non_friend_pass_private_members(int& x);

int B::getx(){
    return this->x;
}

int B::gety(){
    return this->y;
}

void pass_private_members(B& obj){
    non_friend_pass_private_members(obj.x);
}

void non_friend_pass_private_members(int& x){
    x++;
}

主文件

int main(){
    B obj;
    pass_private_members(obj);
    cout << obj.getx() << endl;
    return 0;
}
4

2 回答 2

3

通过声明friend void pass_private_members(B&)您告诉编译器您信任pass_private_members处理B. 它对私有成员的作用与编译器无关。这与拥有一个调用non_friend_pass_private_members.

于 2013-03-25T04:31:32.793 回答
2

是的

它确实违反了封装规则。但是 C++ 在某一时刻打破了许多“纯粹的”OOPL 规则。

让我想起了我最喜欢的 C++ 名言:

C++,唯一可以让朋友访问您的隐私的语言!

于 2013-03-25T04:31:59.543 回答