C++访问控制与友元

核心原则:基于类而非对象。

1、c++的访问控制是类级别的,而不是对象级别的。

cpp 复制代码
class MyClass {
private:
    int secret;
    
public:
    // ✅ 可以访问任何 MyClass 对象的私有成员
    void accessOther(MyClass& other) {
        this->secret = 10;      // 自己的
        other.secret = 20;      // 其他对象的 - 完全合法!
    }
};

int main() {
    MyClass obj1, obj2;
    obj1.accessOther(obj2);  // ✅ 编译通过
}

2、不同类之间的访问规则:不能访问,友元破例。

cpp 复制代码
class ClassA {
private:
    int data;
};

class ClassB {
private:
    int value;
    
public:
    void tryAccess(ClassA& a) {
        a.data = 10;     // ❌ 错误!ClassB 不能访问 ClassA 的私有成员
    }
};
cpp 复制代码
class ClassA {
private:
    int secret;
    
    // 声明 ClassB 为友元
    friend class ClassB;
};

class ClassB {
public:
    void accessClassA(ClassA& a) {
        a.secret = 100;  // ✅ 可以!因为是友元
    }
};

3、模板实例是不同的类型

cpp 复制代码
template<typename T>
class Box {
private:
    T content;
    
public:
    void show(const Box<T>& other) {
        // 不需要友元:Box<int> 访问 Box<int> - 同一个类型
        this->content = other.content;  // ✅
    }
    
    // 问题:Box<int> 访问 Box<double>
    template<typename U>
    void copyFrom(const Box<U>& other) {
        // ❌ 错误!Box<int> 不能访问 Box<double> 的私有成员
        this->content = other.content;
    }
};

解决方案:模板友元

cpp 复制代码
template<typename T>
class Box {
private:
    T content;
    
    // 关键:声明所有 Box<U> 都是友元
    template<typename U>
    friend class Box;
    
public:
    template<typename U>
    void copyFrom(const Box<U>& other) {
        // ✅ 现在可以了!友元声明让所有实例互通
        this->content = other.content;
    }
    
    // 拷贝构造函数模板
    template<typename U>
    Box(const Box<U>& other) : content(other.content) {}
};
相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
2401_841495643 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr3 小时前
2607C++,soui与安卓
c++·soui
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
fqbqrr7 小时前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言