c++ 友元(friend)

在 C++ 中,友元(friend) 是一种机制,允许某个类或函数访问另一个类的私有(private)和保护(protected)成员。友元可以是:

  1. 友元函数:一个普通函数或另一个类的成员函数。
  2. 友元类:一个类可以成为另一个类的友元,从而访问其私有和保护成员。

友元关系打破了类的封装性,因此应谨慎使用,通常用于需要紧密协作的类或函数之间。


友元函数

特点
  • 友元函数是一个普通函数或另一个类的成员函数,但它可以访问类的私有和保护成员。
  • 友元函数不是类的成员函数,因此没有 this 指针。
  • 友元函数需要在类内声明,并使用 friend 关键字。
语法
class ClassName {
    friend ReturnType FunctionName(Parameters); // 声明友元函数
};
示例

以下是一个友元函数的示例:

#include <iostream>

class MyClass {
private:
    int data;

public:
    MyClass(int value) : data(value) {}

    // 声明友元函数
    friend void printData(const MyClass& obj);
};

// 定义友元函数
void printData(const MyClass& obj) {
    std::cout << "Data: " << obj.data << std::endl; // 访问私有成员
}

int main() {
    MyClass obj(42);
    printData(obj); // 调用友元函数
    return 0;
}
输出
Data: 42
解析
  • printData 是一个普通函数,但它被声明为 MyClass 的友元函数,因此可以访问 MyClass 的私有成员 data

友元类

特点
  • 一个类可以成为另一个类的友元,从而访问其私有和保护成员。
  • 友元关系是单向的,不具有传递性(如果 AB 的友元,B 不一定是 A 的友元)。
  • 友元关系不能被继承。
语法
class ClassName {
    friend class FriendClassName; // 声明友元类
};
示例

以下是一个友元类的示例:

#include <iostream>

class MyClass {
private:
    int data;

public:
    MyClass(int value) : data(value) {}

    // 声明友元类
    friend class FriendClass;
};

class FriendClass {
public:
    void printData(const MyClass& obj) {
        std::cout << "Data: " << obj.data << std::endl; // 访问 MyClass 的私有成员
    }
};

int main() {
    MyClass obj(42);
    FriendClass friendObj;
    friendObj.printData(obj); // 调用友元类的成员函数
    return 0;
}
输出
Data: 42
解析
  • FriendClassMyClass 的友元类,因此 FriendClass 的成员函数可以访问 MyClass 的私有成员 data

友元函数作为另一个类的成员函数

友元函数也可以是另一个类的成员函数。这种情况下,该成员函数可以访问声明它为友元的类的私有和保护成员。

示例
#include <iostream>

class MyClass; // 前向声明

class FriendClass {
public:
    void printData(const MyClass& obj);
};

class MyClass {
private:
    int data;

public:
    MyClass(int value) : data(value) {}

    // 声明 FriendClass 的成员函数为友元函数
    friend void FriendClass::printData(const MyClass& obj);
};

// 定义 FriendClass 的成员函数
void FriendClass::printData(const MyClass& obj) {
    std::cout << "Data: " << obj.data << std::endl; // 访问 MyClass 的私有成员
}

int main() {
    MyClass obj(42);
    FriendClass friendObj;
    friendObj.printData(obj); // 调用友元函数
    return 0;
}
输出
Data: 42
解析
  • FriendClass::printDataMyClass 的友元函数,因此它可以访问 MyClass 的私有成员 data

友元的注意事项

  1. 破坏封装性

    • 友元机制打破了类的封装性,因此应谨慎使用。
    • 只有在确实需要访问私有成员时才使用友元。
  2. 单向性

    • 友元关系是单向的。如果 AB 的友元,B 并不会自动成为 A 的友元。
  3. 不可继承

    • 友元关系不能被继承。如果 AB 的友元,A 的派生类不会自动成为 B 的友元。
  4. 不可传递

    • 友元关系不具有传递性。如果 AB 的友元,BC 的友元,A 不会自动成为 C 的友元。

总结

  • 友元函数:允许一个普通函数或另一个类的成员函数访问类的私有和保护成员。
  • 友元类:允许一个类访问另一个类的私有和保护成员。
  • 使用场景:当两个类或函数需要紧密协作时,可以使用友元机制。
  • 注意事项:友元机制破坏了封装性,应谨慎使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值