Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 作为类成员的函数的定义_C++_Function_Class_Private_Member - Fatal编程技术网

C++ 作为类成员的函数的定义

C++ 作为类成员的函数的定义,c++,function,class,private,member,C++,Function,Class,Private,Member,我有两个函数,它们是类“Data”的私有成员: 那么,在哪里最好定义这些函数: 课堂定义 在类外的头文件中 还是在“.cpp”文件中 您可以在这里选择。以下是一些让你下定决心的想法: 速度内联不再是一个问题,因为编译器现在擅长于链接时间优化。因此,性能不应该是这里的决定因素(编译速度也很重要,但这是另一堆蠕虫) 在类内部定义的小型内联成员函数可能是“记录”类所做工作的一种简单方法。此外,这有助于保持实现的本地化,这在阅读代码时非常方便。不过,不要做得太过分 原则上,大型函数应该放在它们自己的

我有两个函数,它们是类“Data”的私有成员:

那么,在哪里最好定义这些函数:

  • 课堂定义
  • 在类外的头文件中
  • 还是在“.cpp”文件中

    • 您可以在这里选择。以下是一些让你下定决心的想法:

      • 速度内联不再是一个问题,因为编译器现在擅长于链接时间优化。因此,性能不应该是这里的决定因素(编译速度也很重要,但这是另一堆蠕虫)
      • 在类内部定义的小型内联成员函数可能是“记录”类所做工作的一种简单方法。此外,这有助于保持实现的本地化,这在阅读代码时非常方便。不过,不要做得太过分
      • 原则上,大型函数应该放在它们自己的文件中,或者至少放在类定义之外,因为它们毫无理由地扰乱了类定义代码。模板代码也不例外
      • Pimpl也有优点/缺点,但在这里,我看不出有什么好的理由在你的简单案例中引入这样的野兽。它们通常用于减少头文件之间的依赖关系
      在这里,如果实现很小,您可以在类内内联编写代码。但是如果逻辑复杂,您应该将它们放在它们自己的实现(“.cpp”)文件中


      您也可以开始内联,当代码变得更复杂时,将实现移到它自己的文件中。

      我个人的想法是将所有函数定义放在实现(.cpp)文件中,因为首先,它分离声明(+文档)从定义中可以增加代码的清晰度,其次,将所有定义放在一个地方(实现文件)使我更容易找到函数。根据我的经验,必须在头文件和实现文件之间切换,以查看我要查找的特定函数是在头文件中内联/定义的,还是在实现文件中定义的,这总是非常麻烦的。在实现文件中拥有所有函数定义意味着我知道我将找到该文件中任何函数的定义,并且不必浪费时间切换和查看。

      < P>我强烈劝阻您考虑选项2。如果在多个实现文件中包含此文件,则链接器会出现“多定义”错误,因为定义将(由预处理器)复制到每个.cpp文件。

      所有这些方法都有其优缺点。视情况而定。您忘了将列为第四个备选方案。我通常会在cpp文件中实现,因为我发现这是我在寻找函数实现时通常会参考的地方,但实际上我认为这可能归结为首选项/约定。如果你是一个团队在一个项目上工作,那么最好坚持这个概念的定义良好的规则。使用选项1或选项3,在这种情况下两者都是好的。重要的是保持一致性。我同意你的观点,但我需要解决这个问题-我应该把成员的定义放在哪里,最重要的是,私人职能?嗯。。。在cpp文件中?您可以在实现文件中定义私有成员函数,就像您可以在公共文件中定义私有成员函数一样。因此,这种想法也适合私有成员函数?@FireCroser:是的,还有非成员函数和运算符。您可以使用
      inline
      关键字告诉链接器不要混淆。
      class Date
      {
      private:
          bool leapYear(int y);
          void fillDate(int d, Month m, int y);
      };