C++一分钟之-属性友元与访问控制

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 【7月更文挑战第9天】C++中的友元机制允许非成员函数或类访问私有和保护成员,打破了封装性。友元需在类内声明,常见的错误包括忘记声明、过度使用及误解友元的非继承性。要避免错误,应明确声明友元,限制其使用,并理解其局限。示例展示了如何声明和使用友元函数来访问私有数据。谨慎使用友元以保持代码的健壮性和可维护性。

在C++中,类的封装性是其核心特性之一,它允许我们定义数据成员和成员函数,并通过访问修饰符(public, protected, private)来控制它们的可访问性。然而,在某些情况下,我们可能希望让一个非成员函数或另一个类能够访问当前类的私有或保护成员,这时就需要用到“友元”(friend)的概念。
image.png

什么是友元?

友元函数或友元类可以访问声明它的类的所有成员,无论这些成员的访问级别如何。这打破了封装原则,但有时为了实现某些功能,如全局函数需要访问类的内部细节,或者一个类需要访问另一个类的私有成员时,友元就显得非常必要了。

常见问题与易错点

  1. 忘记声明友元:这是最常见的错误之一。如果试图在一个类的外部访问其私有或保护成员,而没有正确声明友元关系,编译器会报错。
  2. 过度使用友元:虽然友元可以提供便利,但过度使用会导致封装性被破坏,降低代码的安全性和可维护性。
  3. 友元声明的位置:友元声明必须位于类的内部,但在类的外部声明友元函数或类也是可以的,只要类内部有相应的友元声明即可。
  4. 友元不是继承的:即使A是B的友元,且B是C的基类,A并不自动成为C的友元。友元关系不具有传递性。

如何避免常见错误

  • 明确声明友元:确保在类内部明确声明所有需要访问私有或保护成员的函数或类为友元。
  • 限制友元的使用:只在确实需要访问私有成员的情况下使用友元,尽量保持封装性。
  • 使用局部友元:如果可能,将友元声明限制在最小作用域内,比如只在某个函数内部声明友元,而不是全局范围。
  • 理解友元的局限性:记住友元关系不会自动传递给派生类,需要显式声明。

代码示例

下面是一个简单的示例,展示了如何正确声明和使用友元:

#include <iostream>

class Data {
   
   
private:
    int secret;

public:
    Data(int s) : secret(s) {
   
   }

    // 声明友元函数
    friend void printSecret(Data& d);
};

// 友元函数定义
void printSecret(Data& d) {
   
   
    std::cout << "Secret: " << d.secret << std::endl;
}

int main() {
   
   
    Data d(42);
    printSecret(d);  // 正确调用,因为printSecret是Data的友元
    return 0;
}

在这个例子中,printSecret函数被声明为Data类的友元,因此它可以访问Data的私有成员secret。注意,printSecret函数的定义在类外部,但其声明必须在Data类的内部。

结论

友元机制是C++中一个强大的工具,用于在特定情况下打破封装性,但应谨慎使用,以避免破坏代码的结构和安全性。通过遵循上述指导原则,你可以有效地利用友元,同时保持代码的清晰度和维护性。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
|
1月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1
|
1月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
21 0
|
2月前
|
编译器 数据安全/隐私保护 C++
C++(十四) friend友元
友元机制允许非成员函数或类访问私有成员,提高程序效率,但会破坏封装性。友元可以是函数或类,并以关键字`friend`声明。友元函数不是成员函数,需通过对象访问私有成员。友元类使所有成员函数可访问另一个类的私有成员,常用于简化开发。友元声明位置灵活,但不影响访问控制。使用友元需注意其单向性和非传递性。
|
3月前
|
安全 数据安全/隐私保护
|
4月前
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
44 1
|
4月前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
140 13
|
4月前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。