繁体   English   中英

c ++实现好友/内联函数

[英]c++ implementing friend/inline functions

我似乎无法找到这个新手问题的答案。 如果我有一个类//头文件(.h)

Class X {
public:
  friend bool operator==(const X&, const X&);
  inline size_type rows() const;
};

等...当我去实现X的.cpp文件时,我是否应该在.cpp文件的函数名中包含单词inline&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点是提示编译器可以内联所讨论的函数(但不能保证 - 编译器可以自由决定是否内联函数)。 如果函数是内联的,则对函数体的任何调用都将替换为函数体的副本。 这实际上总是为了性能优势而做,以节省函数调用的成本,但代价是可能增加程序大小。 现在,如果我们想要内联函数,我们希望它在所有地方内联,而不仅仅是在一个编译单元中; 这就是为什么在实现文件中使用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 --aka Koening-- Lookup)会找到它,而在第二种情况下,只要考虑该命名空间,就会考虑该函数。

也就是说,为了让编译器将第一个函数视为重载,调用位置的参数必须test ,而在第二种情况下,只要标识符匹配就会考虑它,如果符号匹配,则可以认为是有效选项。参数可以转换test

您不希望函数体上的朋友前缀,只需要标题中的签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM