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) {}
};
相关推荐
想学习java初学者1 分钟前
SpringBoot整合GS1编码解码
java·spring boot·后端
日月云棠2 分钟前
2 快速入门实战指南
java·后端
日月云棠3 分钟前
3 Dubbo 2.7 高级配置:检查控制、版本策略与协议选择
java·后端
计算机安禾4 分钟前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式
砍材农夫9 分钟前
物联网 基于netty构建mqtt协议规范(主题通配符订阅)
java·前端·javascript·物联网·netty
掉鱼的猫12 分钟前
用 Solon AI 从零构建 MCP 工具服务:让 AI Agent 拥有真实世界的能力
java·llm·mcp
日月云棠12 分钟前
1 分布式架构演进与Dubbo框架入门
java·后端
_日拱一卒19 分钟前
LeetCode:114二叉树展开为链表
java·开发语言·算法
天天进步201522 分钟前
从零打造 Python 全栈项目:智能教学辅助系统
开发语言·人工智能·python
SamDeepThinking24 分钟前
面试官问Bean线程安全,你该从架构角度回答
java·后端·面试