c++ - 使用 friend 关键字和使用成员函数修改类内部的私有(private)变量有什么区别?

标签 c++

正如问题所问...

有什么区别:

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/

相关文章:

c++ - 确定谓词是否适用于范围内的所有元素、部分元素或全部元素

c++ - 异步 cppcms session 。模式

c++ - 究竟什么是streambuf?我该如何使用它?

c++ - 除 44.1kHz 之外的任何速率的 WAV 文件都会使声音变得困惑

c++ - SSE 内在函数位向右移动

C++ 返回指针仅给出数组的第一个元素

c++ - 如何将长整数和/或无符号整数传递给 MPI 参数?

C++ 字符串声明

c++ - 运行 Brute Force 算法时出错?

c++ - 关于cin/cout重载的简单问题