C++ C++;:传递给非好友的好友函数

C++ C++;:传递给非好友的好友函数,c++,encapsulation,friend,access-control,C++,Encapsulation,Friend,Access Control,这不是破坏了封装吗 B.h: B.cpp main.cpp int main(){ B obj; pass_private_members(obj); cout << obj.getx() << endl; return 0; } intmain(){ B obj; 通过私人会员(obj); 通过声明朋友无效通行证私人成员(B&)可以您告诉编译器您信任传递私有成员来处理B的私有成员。它对私有成员所做的事情与编译器无关。这与使用成员函数调用

这不是破坏了封装吗

B.h:

B.cpp

main.cpp

int main(){
    B obj;
    pass_private_members(obj);
    cout << obj.getx() << endl;
    return 0;
}
intmain(){
B obj;
通过私人会员(obj);

通过声明朋友无效通行证私人成员(B&)可以
您告诉编译器您信任
传递私有成员
来处理
B
的私有成员。它对私有成员所做的事情与编译器无关。这与使用成员函数调用
非好友传递私有成员

,声明
好友无效p>没有什么区别ass\u private\u members(B&)
您告诉编译器您信任
pass\u private\u members
来处理
B
的私有成员。它对私有成员的处理与编译器无关。这与使用成员函数调用
非好友pass\u private\u成员
没有什么区别

它打破了封装规则,但是C++在一个或多个点上打破了许多“纯”OOPL规则。

让我想起了我最喜欢的C++引用:

C++,朋友们可以访问你私人空间的唯一语言!

它打破了封装规则,但是C++在一个或多个点上打破了许多“纯”OOPL规则。

让我想起了我最喜欢的C++引用:



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

不,调用
strcpy()也不会
在友元函数上下文中的
char*
成员上。它同样没有友元,但调用者是。友元授予与对象相同的特权。所以问问自己:你能从对象成员函数调用
非友元传递私有成员()
吗?你的意思不清楚“破坏封装"@VaughnCato从非友元和非成员函数访问私有成员您必须在类内声明友元。因此,您可以控制访问成员的确切内容。如果您选择传递实际成员,则与在类内传递相同。@WhozCraig我想他指的是从fr访问私有变量iend函数破坏了封装规则(此处猜测)否,调用strcpy()也不会在友元函数上下文中的
char*
成员上。它同样没有友元,但调用者是。友元授予与对象相同的特权。所以问问自己:你能从对象成员函数调用
非友元传递私有成员()
吗?你的意思不清楚“破坏封装"@VaughnCato从非友元和非成员函数访问私有成员您必须在类内声明友元。因此,您可以控制访问成员的确切内容。如果您选择传递实际成员,则与在类内传递相同。@WhozCraig我想他指的是从fr访问私有变量iend函数打破了封装规则(这里是猜测)啊,但是根据这个问题,如果你的朋友愿意,他们可以让其他人做,我认为你是对的,这就是他所认为的。我的评估是,在授予一个类友谊时,你授予该类成员的所有权利。因此,根据他的猜测(你的回答也是如此)任何未被特别授予访问成员数据的友谊的行为都会破坏封装。这包括运行时库函数等。不仅从朋友函数执行,而且从成员执行。恕我直言,我不同意。你没有违反任何规则,因为有人特别告诉你不必遵守这些规则。@WhozCraig我很感谢你的建议嗯。-)我也是你的。这是你提出的一个很好的观点。啊,但根据这个问题,如果你的朋友愿意,他们可以让别人做,我认为你是对的,他认为这就是他所做的。我的评估是,在给予一个班级友谊时,你给予该班级成员应有的所有权利。因此,根据他的猜测(你的回答也是如此)任何未被特别授予访问成员数据的友谊的行为都会破坏封装。这包括运行时库函数等。不仅从朋友函数执行,而且从成员执行。恕我直言,我不同意。你没有违反任何规则,因为有人特别告诉你不必遵守这些规则。@WhozCraig我很感谢你的建议nsight.:-)我也是你的。这是你提出的一个很好的观点。拥有
friend
函数打破了所有的封装规则。问题是“它是否打破了封装规则”,所以你的答案在这方面没有反映“是”或“否”。拥有
friend
函数打破了所有的封装规则。问题是“它是否违反了封装规则”,因此您的答案在这方面不会反映“是”或“否”。
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;
}