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) {}
};
相关推荐
言乐66 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
xbgRS6 小时前
springboot的自动装配
java·spring boot
嘻哈∠※13 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
WWJA王文举13 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha131413 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
白狐_79814 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25814 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
ShineWinsu14 小时前
对于C++:C++11中lambda、function、bind的解析
c++·面试·笔试·开发·lambda·bind·function
码匠许师傅14 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
qq_4480111615 小时前
C语言中的动态内存分配
c语言·开发语言·php