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) {}
};
相关推荐
FYKJ_20101 小时前
springboot助农产品销售商城05829-计算机课程设计、毕业设计
java·spring boot·python·mysql·spark·django
Yunovian1 小时前
AI时代,针对模型与应用,浅谈一下各编程语言
开发语言·c++·人工智能·python·ai·rust·ai编程
周杰伦fans2 小时前
构建真正智能的CAD AI绘图代理
开发语言·人工智能·c#
user_admin_god3 小时前
第 10 篇:拼上下文与生成——预算、边界与防幻觉
java·人工智能·spring boot·语言模型
用户3126874877203 小时前
GC 算法与垃圾收集器演进:从 Serial 到 ZGC
java
天天被压力4 小时前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #02】涨停跌停与特色股池:5类股池接口一次拉全
java·人工智能·python
斯维赤4 小时前
从 @Tool 到 Agent 流水线:LangChain4j 进阶教学,一个库打全套
java·后端
zhanghaha13144 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
SimonKing4 小时前
SSE项目`nexus-sse`持续优化,不一样的视觉效果
java·后端·程序员
斑鸠喳喳4 小时前
读写锁模式 Read-Write Lock
java·后端