我知道我的类方法有三种不同类型的实现"位置":
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或模板函数)时,我使用它.