我应该在哪里实现我的类方法?

Nic*_*ick 13 c++

我知道我的类方法有三种不同类型的实现"位置":

1)在我的类(.h文件)中定义方法并在我的.cpp文件中实现它

//.h
class Foo
{
  int getVal() const;
};


//.cpp
int Foo::getVal() const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)

2)在我的类(.h文件)中定义并实现该方法.

//.h
class Foo
{
  int getVal() const
  { return 0; }
};
Run Code Online (Sandbox Code Playgroud)

3)在我的类中定义方法并在类外但在我的头文件中实现它.

//.h
class Foo
{
  int getVal() const;
};

int Foo::getVal() const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)

这三种方法有哪些主要区别?

Ide*_*Hat 10

这个问题有三个要素:可读性(代码看起来有多好),编译(编译器可以优化多少)和实现隐藏(如果您将代码用作库,您可能不希望明确地分享您的特殊酱与世界).

方法一只公开头文件中函数的接口.这意味着您将显示一个漂亮的干净界面,并且您的实现不会以纯文本形式公开.但是,代码不能跨编译单元内联,因此它有可能在运行时稍慢(实际上,这仅对非常非常非常小的代码百分比很重要).这应该是你的默认方式.

方法2是隐式内联.冗长的功能会让你的课程变得混乱,因为(imho)很糟糕.同时将您的实现暴露给全世界.但是,该函数可以内联,并且比在另一个地方定义它更简洁.我保留这个非常小的功能.

方法3实际上是非法的,因为您将打破单定义规则,但以下情况很好:

//Foo.h
class Foo {
  int getVal() const;
};

inline int Foo::getVal() const { 
  return 0; 
}
Run Code Online (Sandbox Code Playgroud)

当我想保持类定义干净但想要头文件中的函数定义(对于inlinable或模板函数)时,我使用它.