正如问题所问...
有什么区别:
class MyClass
{
public:
MyClass(){
m_a = 0;
}
private:
int m_a;
friend void set_a(MyClass &a);
};
void set_a(MyClass &a)
{
std::cout << a.m_a << std::endl;
a.m_a = 500;
std::cout << a.m_a << std::endl;
}
int main(void) {
MyClass my_class_instance;
set_a(my_class_instance);
system("pause");
}
和:
class MyClass
{
public:
MyClass(){
m_a = 0;
}
void set_a(){
std::cout << this->m_a << std::endl;
this->m_a = 500;
std::cout << this->m_a << std::endl;
}
private:
int m_a;
};
int main(void) {
MyClass my_class_instance;
my_class_instance.set_a();
system("pause");
}
它仅仅是函数的首选结构,还是存在真实的、可衡量的差异?据我所知,这两个函数在所有情况下都能获得相同的结果,除非您对第一个示例进行了多次重载,这采用了不同类型的对象。
最佳答案
作为the C++ FAQ says : 尽可能使用成员(member),必要时使用 friend 。
有些情况下,让 friend
成为一个自由函数是更可取的,大多数情况与这样一个事实有关:成员函数的第一个参数总是那个类(它的隐藏的 *this
参数)。
一个例子是算术运算符重载:
假设您编写了一个代表复数的 complex
类。使用成员 operator+()
,您可以编写类似 complex + float
的表达式,但不能编写 float + complex
。但是您可以使用 operator+
的自由形式来实现:
class complex
{
...
friend complex operator+( float f , complex c );
};
关于c++ - 使用 friend 关键字和使用成员函数修改类内部的私有(private)变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22880087/