c++实现了friend/inline函数
c++ implementing friend/inline functions
我似乎找不到这个新手问题的答案。如果我有课//头文件(.h(
Class X {
public:
friend bool operator==(const X&, const X&);
inline size_type rows() const;
};
等等。。。当我去实现X的.cpp文件时,我应该包括inline&.cpp文件中函数名中的friend。即,我是否应该实现类似于下面的文件
// CPP file (.cpp)
#include "X.h"
friend bool operator==(const X&, const X&) {
//implementation goes here
//return true/false
}
inline size_type rows() const {
return r;
}
或者我应该不包括这些,比如下面的
#include "X.h"
bool operator==(const X&, const X&) { ... }
size_type rows() const { ... }
不,你不应该这样做,即第二个版本是正确的。
friend
只能在类定义中使用(它在类定义之外没有任何意义(,编译器会查找函数签名,以找到在类X
中声明的friend
函数的定义。
inline
用于头文件(尽管,我想,从技术上讲,也可以在cpp文件中使用它,只是它在那里没有意义(。请注意,inline
只有在您真正定义了函数的情况下才有意义——如果您在cpp文件中单独提供函数定义,它可能没有任何作用。
inline
的目的是向编译器提示有问题的函数可以内联(但这并不能保证——编译器可以自由决定是否内联该函数(。如果函数是内联的,那么对它的任何调用都会被函数体的副本所替换。实际上,这样做总是为了提高性能,节省函数调用的成本,而可能会增加程序大小。现在,如果我们想内联一个函数,我们希望它在所有地方都内联,而不仅仅是在一个编译单元内;这就是为什么在实现文件中使用inline
关键字没有什么意义。
定义friend
函数时,可以使用两个不同选项之一:
在类定义中定义friend
函数
namespace Test {
class test {
int priv;
friend void foo( test const & t ) { std::cout << t.priv << std::endl; }
};
}
在封闭的命名空间中定义它们:
namespace Test {
class test {
int priv;
friend void foo( test const & t );
};
void foo( test const & t ) {
std::cout << t.priv << std::endl;
}
}
但请注意,在查找方面存在差异。特别是,第一种情况更具限制性(因此应该是首选(,因为只有ADL(Argument Dependent,又名Koening——Lookup(会找到它,而在第二种情况下,只要考虑该命名空间,就会考虑该函数。
也就是说,编译器要将第一个函数视为重载,调用位置的参数必须为test
,而在第二种情况下,只要标识符匹配,就会将其视为有效选项,并且如果参数可转换为test
,则可以将其视为由有效选项。
您不需要函数体上的友元前缀,只需要标头中的签名。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 激励'inline'说明符的真实世界示例?
- 'inline'变量可以像内联函数一样内联吗?
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 将新元素推送到函数指针映射中 "inline" ?
- 在头文件中实现的函数的static与inline
- 成员函数模板"inline"需要
- C++错误:'inline'只能出现在函数上
- 什么是'extern inline'函数以及何时使用?
- "inline"隐式于类定义中定义的C++成员函数中
- 'inline'__global__函数以避免多个定义错误
- 我应该在频繁使用的函数上使用“inline”吗?
- c++实现了friend/inline函数
- 让函数包装器与inline一起工作
- 替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]
- "在线好友…"有什么区别函数和`friend inline…`功能
- 包装INLINE函数
- 模板' inline '函数的静态局部变量
- "inline"函数定义的目的是什么?