📌  相关文章
📜  为什么 << 运算符是朋友 - C++ (1)

📅  最后修改于: 2023-12-03 15:06:16.252000             🧑  作者: Mango

为什么 << 运算符是朋友 - C++

在C++中,<<运算符通常用于将数据插入到流中以进行输出。事实上,许多C++程序员都习惯于使用<<运算符来代替cout。但是,对于某些类来说,即使是正确的使用<<运算符也可能是不够的。这就是为什么我们需要使用朋友函数访问类中的私有成员变量。

朋友函数

在C++中,类可以将其他函数定义为朋友函数,以便它们可以访问该类中的私有成员变量。如果一个函数是类的朋友函数,那么它就可以访问私有的成员变量和方法。关键字friend表示函数或类是一个友元。

class MyClass {
private:
    int myVar;

public:
    friend void myFriendFunction(MyClass& obj);
};

void myFriendFunction(MyClass& obj) {
    obj.myVar = 42;
}

在上面的示例中,MyClass类定义了一个名为myVar的私有成员变量,并将myFriendFunction定义为该类的朋友函数。myFriendFunction可以在访问MyClass的私有成员变量和方法时自由使用。

<< 运算符

对于某些类来说,重载<<运算符是很有用的,因为它允许将类对象输出到流中。然而,有时候即使是正确的使用<<运算符也无法访问类的私有成员变量。这时,我们需要定义一个朋友函数作为<<运算符的重载。这使得<<运算符可以访问私有变量,从而实现必要的输出。

#include <iostream>

class MyClass {
private:
    int myVar;

public:
    MyClass(int x) : myVar(x) { }

    friend std::ostream& operator<<(std::ostream& os, const MyClass& obj) {
        os << obj.myVar;
        return os;
    }
};

int main() {
    MyClass obj(42);
    std::cout << obj << std::endl;
    return 0;
}

在上面的示例中,我们定义了一个带有构造函数的类MyClass,它有一个私有的成员变量myVar。我们还重载了<<运算符,并将其定义为MyClass的朋友函数,以便它可以访问myVar并将其插入到流中。

最后,我们在main函数中创建了一个MyClass对象,并使用<<运算符将其输出到屏幕上。输出结果将是42

总之,重载<<运算符并定义为朋友函数可以让它访问类的私有成员变量,并使类的对象可以直接插入到流中进行输出,这非常有用。