C++笔记--关于友元函数和静态成员函数
今天在写程序时用到了好多静态成员函数,然后突然想到了友元函数,有些思考。
首先,两者都可以读写对象的成员变量。基于此可以认为静态函数和友元函数都具有访问类内部数据的权限。静态函数毫无疑问具有类作用域,而友元函数本身可能是全局函数、也可能是其他类的成员函数,所以我猜测是不是可以理解为静态函数是友元函数的一种特例。
接下来,我想验证友元函数是否也可以具有类作用域,所以我打算在类内部定义一个友元函数。
接着,我百度到了这篇文章:
https://blog.csdn.net/weixin_34260991/article/details/93819698
他在类内部定义了两个友元函数,一个无参数、一个以此类对象为参数。结果,调用无参的函数不能通过编译,以此类对象为参数的函数可以通过编译,并且可以正常运行。
我认为,因为这两个函数定义在类内部,因此不具有全局作用域,编译器在调用函数这一行会自动检索当前作用域下是否有这个函数的声明,两个函数都没有,但是有参数的那个函数,有一个·类对象作为参数,编译器据此到类内部去检查是否有这个函数的声明,然后它成功找到了。
所以,他一个函数能通过编译,一个不能通过编译的原因就在于编译器是否找到了函数声明。也就是说,这是一个函数作用域的问题。
我首先尝试以调用静态函数的写法来调用无参函数,结果编译失败。然后我在全局作用域声明此无参函数,然后在main函数中调用,通过编译,并可正常运行。
#include <iostream>
using namespace std;
class T
{
public:
T(){}
~T(){}
//不引入类对象
friend void show_hello_no_param()
{
cout << "show_hello_no_param() of T : Hello world!\n";
}
private:
//引入类对象
friend void show_hello(T t)
{
cout << "show_hello() of T : Hello world!\n";
}
};
void show_hello_no_param();
int main()
{
T t;
show_hello_no_param(); //编译通过
T::show_hello_no_param(); //编译不能通过
show_hello(t); //编译可以通过
getchar();
return 0;
}
虽说问题解决了,但是对于编译器可以根据函数参数到对应类型作用域内查找函数声明的这种按图索骥的能力表示赞叹!(我没有验证以此类型的对象为返回值是否可以,我认为不可以)
最后,关于我的猜想(友元函数是否也可以具有类作用域)。我认为不可以。