C++友元函数,友元类

友元函数

友元函数是在C++中用来访问另一个类的私有成员的一种机制。通过将函数声明为友元函数,可以使该函数能够访问类中的私有成员,即使它不是类的成员函数或者成员。

  1. 在类的声明中声明友元函数:将友元函数的原型放在类的声明中,并在函数原型前加上friend关键字。
  2. 在类外部定义友元函数:在类的外部定义友元函数,并在函数定义前不需要再使用friend关键字。友元函数可以直接访问类的私有成员。
  3. 创建类对象并调用友元函数:创建类的对象,并通过对象调用友元函数。友元函数可以读取和修改类的私有成员。

注意事项:

  • 友元函数不是类的成员函数,因此没有隐式的this指针。如果需要访问非静态成员,可以通过对象引用或指针来访问。
  • 友元关系不具有传递性。如果类A是类B的友元类,类B是类C的友元类,那么类C不会自动成为类A的友元类。
  • 一个类可以有多个友元函数,每个友元函数都需要单独声明。
  • 友元关系破坏了封装性和隐藏性,因此应谨慎使用友元函数。
// 友元函数参数说明
友元函数的参数可以根据需要进行灵活的设定。
友元函数可以接受任意类型的参数,包括类对象、基本数据类型、指针等。
在设定友元函数参数时,需要确保参数的类型和数量与友元函数的定义一致,以便正确地在函数内部访问和操作相应的数据。
#include <iostream>
class MyClass {
private:
    int privateData;
public:
    MyClass() : privateData(0) {}
    // 友元函数声明
    friend void friendFunction(MyClass& obj);
    void setPrivateData(int data) {
        privateData = data;
    }
};
// 友元函数定义
void friendFunction(MyClass& obj) {
    std::cout << "访问私有数据: " << obj.privateData << std::endl;
}
int main() {
    MyClass obj;
    obj.setPrivateData(42);
    // 调用友元函数
    friendFunction(obj);
    return 0;
}

特点

  • 访问权限:友元函数可以访问类的私有成员和保护成员。这意味着它可以读取和修改类的私有数据,以及调用类的私有成员函数。
  • 不是成员函数:友元函数不是类的成员函数,它在类的外部定义。它没有隐式的this指针,因此不能直接访问类的非静态成员变量和非静态成员函数。但是,可以通过对象引用或指针来访问它们。
  • 具有独立的作用域:友元函数拥有自己的作用域,不受类的作用域限制。因此,在友元函数中可以定义与类中已有成员同名的变量或函数。
  • 友元关系不具有传递性:友元关系不具有传递性。如果类A是类B的友元类,类B是类C的友元类,那么类C不会自动成为类A的友元类。每个友元关系都是独立的,需要单独声明。
  • 多个友元函数:一个类可以有多个友元函数。这些友元函数可以是不同的非成员函数,它们都可以访问该类的私有成员。
  • 友元类:除了友元函数,C++还支持友元类。当一个类被声明为另一个类的友元类时,它可以访问该类的私有成员。
  • 破坏封装性:友元函数可以直接访问类的私有成员,这可能会破坏类的封装性。因此,应该谨慎使用友元函数,只在确实需要访问私有成员的情况下使用。

优点:

  1. 访问类的私有成员:
    友元函数能够直接访问类的私有成员,包括私有变量和私有函数。这种访问权限提供了更大的灵活性,可以在需要时获取或修改类的私有数据。
  2. 增加灵活性:
    友元函数不受类的作用域限制,它可以在类的外部定义,并且不是类的成员函数。这使得我们可以在需要时将一个或多个非成员函数声明为友元函数,以便让它们能够访问类的私有成员。
  3. 容易实现操作符重载:
    友元函数可以用于实现一些特殊的操作符重载,例如重载输入输出运算符(<< 和>>)以便于以自定义格式输入和输出类对象。

缺点:

  1. 破坏封装性:
    友元函数可以直接访问类的私有成员,这可能破坏类的封装性和数据隐藏。封装是面向对象编程的核心原则之一,它目的是通过将数据和操作封装在类中,使得类对外部代码隐藏其内部实现细节。使用友元函数可能会打破这种封装性。
  2. 增加耦合性:
    友元函数需要在类的定义中进行声明,这将导致类与友元函数之间产生一种耦合性。这意味着当类的实现发生更改时,可能需要同时修改友元函数的实现。这增加了代码维护的复杂性。
  3. 潜在安全风险:
    由于友元函数可以直接访问类的私有成员,如果使用不当,可能会导致安全风险。如果其他代码错误地访问或修改了类的私有成员,可能会导致意外的行为或错误。

友元类

友元类(Friend class)是一种特殊的类关系,允许一个类的成员函数或非成员函数访问另一个类的私有成员。在C++中,可以使用关键字friend来声明友元类。

一个类可以将另一个类声明为友元类,这样友元类就能够访问被声明为友元的类中的私有成员。被声明为友元类的类可以访问其它类的私有成员,就像它们是自己的成员一样。

友元关系是单向的,如果类A将类B声明为友元类,那么只有类A可以访问类B的私有成员,而类B不能访问类A的私有成员。

下面是一个示例代码,展示了如何在C++中声明和使用友元类:

class FriendClass {
private:
    int privateData;
public:
    FriendClass() : privateData(0) {}
    friend class MyClass;
};

class MyClass {
public:
    void accessPrivateData(FriendClass& friendObj) {
        // 友元类可以访问 FriendClass 的私有成员
        friendObj.privateData = 42;
    }
};

在上面的示例中,FriendClass声明了MyClass为友元类。这意味着MyClass可以访问FriendClass的私有成员privateData。通过accessPrivateData函数,MyClass可以修改FriendClass对象的privateData值。

注意,友元类的声明通常放在类定义中,但不是类的成员。友元类的声明只需要在需要访问私有成员的类中进行,并不需要在被访问的类中进行声明。

友元类是一种特殊的类关系,在某些情况下可以提供更灵活的访问控制。但是,应该谨慎使用友元类,因为它破坏了封装性,可能导致代码的可维护性和安全性降低。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值