c++如何写友原函数
时间: 2025-05-19 14:25:26 浏览: 13
### C++ 中友元函数的编写与用法
#### 定义友元函数
在 C++ 中,友元函数是一种特殊类型的函数,它可以访问类中的 `private` 和 `protected` 成员。尽管它不是该类的成员函数,但由于被声明为友元,因此具有这种特权。
为了使某个函数成为某类的友元,在类内部需要使用关键字 `friend` 进行声明[^1]。例如:
```cpp
class MyClass {
private:
int secretValue;
public:
MyClass(int val) : secretValue(val) {}
// 声明友元函数
friend void displaySecret(const MyClass& obj);
};
// 定义友元函数
void displaySecret(const MyClass& obj) {
cout << "The secret value is: " << obj.secretValue << endl;
}
```
上述代码展示了如何定义并实现一个简单的友元函数[^4]。注意,虽然 `displaySecret()` 不属于 `MyClass` 的成员方法集合,但它可以通过友元关系访问到 `secretValue` 私有变量。
#### 使用场景举例
当涉及到跨多个类的操作或者需要对外提供某些特定功能时,友元机制显得尤为重要。下面给出几个典型的应用案例说明其实际用途。
##### 场景一:修改对象状态
如果希望创建一个外部工具函数用于调整现有对象的状态而不必暴露过多接口给用户端调用者的话,那么利用友元特性会非常方便快捷[^2]。如下所示:
```cpp
#include <iostream>
using namespace std;
class Student {
private:
string name;
int age;
public:
Student(string n, int a):name(n),age(a){}
// 将changeAge设为Student类的好朋友
friend void changeAge(Student *s,int new_age){
(*s).age=new_age;
}
void showInfo(){
cout<<"Name:"<<this->name<<", Age:"<<this->age<<endl;
}
};
int main(){
Student stu("Tom",18);
stu.showInfo();
// 调用友元函数改变年龄属性值
changeAge(&stu,20);
stu.showInfo();
return 0;
}
```
这里我们看到即使 `changeAge` 是全局范围内的独立过程而非任何类别下的成员行为模式之一;然而由于事先赋予了它的特别权限——即成为了目标实体(`Student`)的一位亲密伙伴之后便得以合法地干涉后者那些原本受保护起来的数据字段啦!
##### 场景二:支持运算符重载
另一个常见的应用领域是在自定义类型上重新定义标准算术表达式的含义以便于更加自然直观地处理复杂逻辑结构的时候需要用到此类技术手段[^3]。考虑这样一个例子吧:
```cpp
#include <iostream>
using namespace std;
class ComplexNumber{
double real,img;
public :
ComplexNumber(double r=0,double i=0):real(r),img(i){}
// 加入加号操作符的支持
friend const ComplexNumber operator+(const ComplexNumber &c1,const ComplexNumber &c2);
void print() const{cout<<real<<(img>=0?"+":"")<<img<<"i"<<endl;}
};
const ComplexNumber operator+(const ComplexNumber &c1,const ComplexNumber &c2){
return ComplexNumber(c1.real+c2.real,c1.img+c2.img);
}
int main(){
ComplexNumber cn1(3,-7),cn2(-5,9);
(cn1+cn2).print(); //-2+2i
return 0;
}
```
在这个程序里头,为了让两个复数相加以常规方式书写出来就像对待基本数值型那样简单易懂,我们就借助到了前面提到过的那个概念来完成这项任务咯~
---
###
阅读全文
相关推荐



















