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

the*_*Air 8 c++ header class function friend

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

Class X {
public:
  friend bool operator==(const X&, const X&);
  inline size_type rows() const;
};
Run Code Online (Sandbox Code Playgroud)

等...当我去实现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;
}
Run Code Online (Sandbox Code Playgroud)

或者我不应该包括这些,如下所示

#include "X.h"
bool operator==(const X&, const X&) { ... }

size_type rows() const { ... }
Run Code Online (Sandbox Code Playgroud)

Pét*_*rök 6

不,你不应该,即第二版是正确的.

friend只能在类定义中使用(它没有任何意义),编译器会查找函数签名以查找friend在类中声明的函数的定义X.

inline在头文件中使用(虽然,我想,从技术上讲,也可以在cpp文件中使用它,只是没有意义).请注意,inline只有在实际定义函数时才有意义 - 如果在cpp文件中单独提供函数定义,则无效.

关键inline是要提示编译器有问题的函数可以内联(但不能保证 - 编译器可以自由决定是否内联函数).如果函数是内联的,则对函数体的任何调用都将替换为函数体的副本.这实际上总是为了性能优势而做,以节省函数调用的成本,但代价是可能增加程序大小.现在,如果我们想要内联函数,我们希望它在所有地方内联,而不仅仅是在一个编译单元中; 这就是inline在实现文件中使用关键字没有意义的原因.

  • 实际上,有一个**使用`inline`.声明为"inline"的函数可能会在不同的转换单元中出现多次,并且在链接时不会导致*重复*错误.我不知道这是否是标准行为. (2认同)