C++11 friend
时间: 2025-01-31 10:32:21 AIGC 浏览: 45
### C++11 中 `friend` 关键字的用法和特性
#### 定义与作用
`friend` 关键字用于声明友元函数或友元类。这使得被声明的对象能够访问该类中的私有成员和保护成员,即使这些成员通常对外部不可见。
#### 友元函数
当一个函数被声明为某个类的友元时,它可以访问这个类的所有成员,包括私有的和受保护的成员。下面是一个简单的例子:
```cpp
class MyClass {
private:
int value;
public:
MyClass(int v) : value(v) {}
friend void display(MyClass obj);
};
void display(MyClass obj) {
std::cout << "Value is: " << obj.value; // Accessing private member
}
```
这里定义了一个名为 `MyClass` 的类,并将其构造函数初始化为接收整数参数。通过将全局范围内的 `display()` 函数标记为 `friend`,可以在不违反封装原则的情况下直接操作对象内部的数据[^3]。
#### 友元类
除了单个函数外,还可以指定整个类作为另一个类的朋友。这意味着前者可以获得后者所有的非公有属性以及方法。考虑如下场景:
```cpp
class FriendClass;
class OriginalClass {
private:
double secretNumber;
public:
OriginalClass(double num):secretNumber(num){}
friend class FriendClass;
};
class FriendClass {
public:
void showSecret(OriginalClass& oc){
cout<<"The hidden number inside OriginalClass instance:"<<oc.secretNumber<<endl;
}
};
```
在这个案例里,`FriendClass` 成为了 `OriginalClass` 类的好朋友,从而允许它读取并打印出原本属于对方隐私级别的变量 `secretNumber`[^4]。
#### 常量成员函数成为友元的情况
如果希望让某些特定类型的常量对象也支持类似的特权,则可以通过添加额外的关键字来实现这一点。例如:
```cpp
class Container {
private:
float dataMember;
public:
explicit Container(float d) : dataMember(d){}
const float getData() const {return this->dataMember;}
friend bool operator==(const Container &lhs, const Container &rhs);
};
bool operator==(const Container &lhs, const Container &rhs) {
return lhs.getData()== rhs.getData();
}
```
上述代码片段展示了如何创建两个容器实例之间的相等比较运算符重载版本。值得注意的是,在此情况下,即便左侧表达式是恒定不变的形式(即带有 `const`),右侧仍然能正常工作因为它们都是由同一个外部实体所管理着——这就是所谓的“双面胶水”,既保持了一致性又实现了灵活性[^5]。
阅读全文
相关推荐



















