c++友元类 如何使用,请你举一个代码实例说明
时间: 2024-10-17 09:06:09 浏览: 28
C++中的友元类是指一个类将另一个类声明为它的友元,这样这个友元类就可以访问原类的私有和保护成员。下面是一个简单的示例:
```cpp
#include <iostream>
class B; // 前向声明
class A {
private:
int x;
public:
A(int val) : x(val) {}
friend class B; // 声明B为A的友元类
};
class B {
public:
void setX(A& a, int val) {
a.x = val; // 可以访问A的私有成员x
}
};
int main() {
A a(10);
B b;
b.setX(a, 20);
std::cout << "A的x值为: " << a.x << std::endl; // 输出A的x值为: 20
return 0;
}
```
在这个例子中,类A有一个私有成员变量`x`,我们通过声明类B为A的友元类,使得类B的成员函数`setX`可以直接访问类A的私有成员`x`。在`main`函数中,我们创建了类A和类B的对象,并通过类B的成员函数`setX`修改了类A的私有成员`x`的值。
相关问题
给我一段 c++ 类模板外实现 友元函数的代码
在C++中,类模板外实现友元函数是一种常见的设计模式,它允许你定义一个函数为类模板的成员,但该函数实际上是在类模板外部定义的。这样做通常是为了避免模板的完全实例化带来的性能问题或者因为友元函数不需要知道模板的具体类型。
下面是一个简单的例子:
```cpp
// 定义一个通用的友元函数模板,接受任意类型的参数
template <typename T>
void printValue(const T& value) {
std::cout << "Value: " << value << std::endl;
}
// 然后在类模板之外声明这个友元函数为MyTemplate类的友元
template <typename T>
class MyTemplate {
public:
// 类的其他成员...
private:
// 类的私有成员...
// 将printValue函数作为友元,无需在模板内指定
friend void printValue(const T& value);
};
int main() {
MyTemplate<int> myInt(10);
printValue(myInt); // 正常访问,尽管函数不在类模板内部
return 0;
}
```
在这个例子中,`printValue`函数无需知道`MyTemplate`的细节,可以直接访问其成员变量。
c++友元函数的类外定义
C++中的友元函数是一种特殊的关系,它允许非成员函数访问类的私有和保护成员。通常,友元函数并不是类的一部分,而是被明确地声明为该类的友元。这意味着,尽管它们不是类的成员,但在类的作用域内可以像类的内部函数一样直接操作类的数据。
类外定义的友元函数需要在类声明外部定义,并通过`friend`关键字将其与相应的类关联起来。例如:
```cpp
class MyClass {
private:
int privateVar;
public:
// 其他成员函数...
friend void printPrivate(MyClass& obj); // 类外定义并声明为友元
};
// 友元函数的定义放在类外面
void printPrivate(MyClass& obj) {
std::cout << "Private variable value: " << obj.privateVar << std::endl;
}
```
在这里,`printPrivate`函数可以访问`MyClass`实例的`privateVar`,即使它在类体之外定义。然而,为了保持封装原则,友元应该谨慎使用,因为过多的友元可能会破坏封装性和代码的模块化。
阅读全文