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) {}
};
相关推荐
小bo波7 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯9 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
apocelipes11 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
SamDeepThinking19 小时前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好20 小时前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng21 小时前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking21 小时前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
Flittly2 天前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了2 天前
Java 生成二维码解决方案
java·后端
人活一口气2 天前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot