关于友元函数在类内定义的问题--笔记
时间: 2023-10-20 19:23:32 浏览: 48
友元函数是指在类中声明,但在类外定义的非成员函数。其作用是可以访问类的私有成员,但并不是类的成员函数。在类内定义友元函数,可以将其视为成员函数的一种特殊形式,这样可以访问类的私有成员,但不需要通过类的对象来调用。
在类内定义友元函数,需要在函数声明前加上关键字 "friend",并且在类中声明该函数。具体语法格式如下:
```
class A {
public:
friend void func() {
// 函数体
}
};
```
在上述示例中,我们在类A中定义了一个友元函数func()。在函数声明前加上friend关键字,表示声明该函数为类A的友元函数。在函数定义后,我们没有使用类A的对象来调用该函数,而是直接调用了func()。
需要注意的是,在类内定义友元函数时,只能定义非成员函数,并且不能定义成员函数。如果需要定义成员函数,应该在类的外部进行定义。
相关问题
友元函数在类外如何定义
友元函数是可以访问类的私有成员的非成员函数,可以在类定义之外定义,但需要在类定义中声明。具体的语法格式如下:
```
class MyClass {
private:
int x;
friend void myFriend(MyClass obj); //友元函数声明
};
void myFriend(MyClass obj) {
cout << obj.x << endl; //可以访问 MyClass 的私有成员 x
}
```
在上面的例子中,myFriend() 函数被声明为 MyClass 类的友元函数,可以访问 MyClass 的私有成员 x。在类定义之外,我们需要对 myFriend() 函数进行定义,但是不需要使用类名限定符。
友元函数重载运算符类内定义和类外定义的使用方法
友元函数重载运算符可以在类内和类外分别定义。类内定义的方式将会把友元函数的定义嵌入到类的定义中,而类外定义的方式则是在类外单独定义一个函数,将类作为参数传递进去进行运算符重载。
下面是类内定义运算符重载的示例,假设我们有一个`Complex`类,表示复数:
```cpp
class Complex {
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
Complex operator+(const Complex& other) const;
friend Complex operator-(const Complex& c1, const Complex& c2);
private:
double real, imag;
};
// 类内定义的运算符重载函数
Complex Complex::operator+(const Complex& other) const {
return Complex(real + other.real, imag + other.imag);
}
```
在上述示例中,我们在`Complex`类内定义了一个重载"+"运算符的函数,它接受一个`Complex`类型的参数`other`,返回一个`Complex`类型的对象。在函数中,我们可以访问`Complex`类的私有成员`real`和`imag`,并进行自定义的相加操作,最终返回一个新的`Complex`对象。
下面是类外定义运算符重载的示例,我们以`-`运算符为例:
```cpp
class Complex {
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
Complex operator+(const Complex& other) const;
friend Complex operator-(const Complex& c1, const Complex& c2);
private:
double real, imag;
};
// 类外定义的运算符重载函数
Complex operator-(const Complex& c1, const Complex& c2) {
return Complex(c1.real - c2.real, c1.imag - c2.imag);
}
```
在上述示例中,我们在`Complex`类外定义了一个重载"-"运算符的函数,它接受两个`Complex`类型的参数`c1`和`c2`,返回一个`Complex`类型的对象。在函数中,我们可以访问`Complex`类的私有成员`real`和`imag`,并进行自定义的相减操作,最终返回一个新的`Complex`对象。
需要注意的是,类内定义的运算符重载函数只能访问类的公有和私有成员,而类外定义的友元函数可以访问类的私有成员。因此,如果需要访问类的私有成员,必须使用类外定义的友元函数。