我们平常使用友元函数都仅是在类内部声明,在类外定义,今天看到了一个在类内定义的例子,就产生了好奇,把自己的总结记录下来;
先看例子
class T
{
public:
T();
~T();
//不引入类对象
friend void show_hello_no_param()
{
std::cout << "show_hello_no_param() of T : Hello world!\n";
}
//引入类对象
friend void show_hello(T t)
{
std::cout << "show_hello() of T : Hello world!\n";
}
};
int main(int argc, char* argv[])
{
T t;
show_hello_no_param(); //编译不通过
show_hello(t); //编译可以通过
getchar();
return 0;
}
根据上面的例子感觉像是类内定义的友元函数在类对象的作用域内可以编译通过;
同时也试了下传指针也能编译通过,T* t=NULL或 t = new T()结果一样都能通过;
T* t=NULL;//new T();
//show_hello_no_param(); //编译不通过
show_hello(t); //编译可以通过
这里面到底涉及什么原理还没搞清楚,希望清楚的高手能赐教一下。
另外
#include<iostream>
using namespace std;
class Au
{
private:
int a;
int b;
int c;
//inline friend void fun();
public:
friend void funA(Au a)
{
cout << a.a << "funA" << endl;
}
friend void funB()
{
cout << b << "funB" << endl; //编译报错 成员b不是静态static的
}
friend void funC()
{
cout << "funC" << endl;
}
};
int main()
{
Au a;
funA(a);
funB(); //编译报错:函数未定义,同上个例子(将改为static的之后仍然报这个错)
funC(); //编译报错:说函数未定义,同上个例子
return 0;
}
编译如下:
yu@MAC:~/$ g++ qq.cpp -o main -Wall
qq.cpp: In function ‘int main()’:
qq.cpp:39:2: error: ‘funB’ was not declared in this scope
funB();
^~~~
qq.cpp:40:2: error: ‘funC’ was not declared in this scope
funC();
参考:
https://www.cnblogs.com/guoliushui/p/9485469.htm