这是头文件中的声明:
class PrimeSieve
{
populate(int lim);
vector<int> sieve;
long long limit;
public:
unsigned int limit();
};
我应该在.cpp文件中还是在.h中定义访问者方法,内联?
我是C ++的新手,但我想遵循最佳实践。我在一些书中看过这个 - 这被认为是标准吗?
unsigned int limit() { return limit; };
答案 0 :(得分:11)
绝对在头文件中内联编写访问器。它可以实现更好的优化,并且不会减少封装(因为更改私有数据的格式需要重新编译包含头的所有单元)。
对于复杂算法,您可能希望在实现文件中隐藏定义。或者,当实现需要类定义所不需要的某些类型/头文件时。这些案例都不适用于简单的访问者。
对于单行,将其放在类定义中。稍长的成员函数应该仍然在头文件中,但可以在类定义之后显式声明inline
。
答案 1 :(得分:7)
大多数较新的编译器足够聪明,可以内联所需的内容并将其他所有内容都留下。所以让编译器尽其所能,不要试图再次猜测它。
将所有代码放在.cpp中,将代码声明放在.h。
中答案 2 :(得分:0)
一个好的经验法则是将所有代码放在.cpp文件中,这样就会反对.h文件中的内联函数。
答案 3 :(得分:0)
对于类的客户端完全可见的类中的简单数据类型,没有真正的区别,因为您需要在类定义更改时重新编译客户端。
创建访问器而不是直接使用成员的主要原因是允许实现稍后删除数据成员并仍然保持接口兼容;如果包含访问器的接口未更改,则结果通常是二进制兼容的,否则,它的源兼容。将访问器设置为内联意味着将其定义为您要更改的界面的一部分,因此您只能与源代码兼容。
拥有访问者的另一个原因是DLL边界:如果您的访问者需要调用另一个函数,并允许它被内联,那么此函数的符号也需要导出到客户端。
根据项目的复杂性,将代码的接口定义为抽象类可能是有益的,它允许您将实现更改为您的内容而无需客户端看到更改;在这种情况下,访问器在接口类中被定义为抽象,客户端无法内联它们。
答案 4 :(得分:0)
声明访问者inline
的论点是,这消除了调用开销,并且可以启用一些进一步的优化。
我对测量性能的经验是,这样做的收益通常相当适中。因此我默认不再这样做。
答案 5 :(得分:-1)
不仅仅是一种全球性的编程标准,这些标准因组织而异。当然,getLimit()
仍然会比仅仅limit()
更好。