关于C++友元函数的实现讲解
C++中的友元函数能够访问一个类的私有成员和保护成员,但不属于该类,也不是该类的成员函数,需要在类定义之外单独进行声明和定义。
友元函数的声明
友元函数的声明需在类的定义之外进行,并在函数名之前加上friend
关键字。示例代码如下:
class A {
friend void B::function(A&);
}
在上述代码中,类A声明了一个名为B
的类的成员函数function
为其友元函数。
友元函数的定义
友元函数的定义应放在函数名及参数之后,使用::
运算符指明归属的类名。示例代码如下:
class B {
public:
void function(A&);
};
void B::function(A& a) {
// 在函数中可以访问A的私有成员和保护成员
}
在上述代码中,类B定义了一个名为function
的成员函数,并在函数定义之前使用friend
关键字声明类A的一个参数为A&
类型的成员函数function
为其友元函数。在函数定义中可以访问A的私有成员和保护成员。
示例1
class B;
class A {
int a;
public:
A(int a) : a(a) {}
friend void B::changeA(A&, int);
};
class B {
public:
void changeA(A& obj, int value) {
obj.a = value;
}
};
int main() {
A obj(1);
B b;
b.changeA(obj, 2); // 调用B类的友元函数修改A类的私有成员
return 0;
}
示例1中,类A的私有成员a
被友元函数B::changeA
访问并修改。在类A声明友元函数时,需要在类定义之前声明类B,因为成员函数(包括友元函数)在定义时需要访问其归属类的定义。
示例2
class Complex;
class Real {
double val;
public:
Real(double val) : val(val) {}
friend Real operator+(Real&, Complex&);
friend Real operator-(Real&, Complex&);
};
class Complex {
double real, imag;
public:
Complex(double real, double imag) : real(real), imag(imag) {}
friend Real operator+(Real&, Complex&);
friend Real operator-(Real&, Complex&);
};
Real operator+(Real& r, Complex& c) {
return Real(r.val + c.real);
}
Real operator-(Real& r, Complex& c) {
return Real(r.val - c.real);
}
int main() {
Real r(2);
Complex c(1, 2);
// 调用友元函数重载实现Real和Complex的运算
Real result1 = r + c;
Real result2 = r - c;
return 0;
}
示例2中,定义了一个名为Complex的类,以及一个名为Real的类,并重载了名为+
和-
的运算符以实现Real和Complex的运算。在上述代码中,Real类和Complex类中的+
和-
运算符函数被定义为Real类的友元函数,使得Real类和Complex类之间可以进行运算。在main函数中通过调用友元函数重载实现Real和Complex的运算。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于C++友元函数的实现讲解 - Python技术站