浅谈C++类的内联成员函数应放在那个文件

在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持;转载:http://www.gdtarena.com/
  今天复习C++ Primer的时候,看到了关于C++类的内联成员函数的放置,应该放在头文件中。那么这到底是为什么呢?仅仅是一种代码规范问题还是必须这样做呢?

  下面我就来讲讲我自己的理解吧。要彻底理解这个问题,首先就要了解下函数的声明和定义了。我们知道,函数可以在多处声明,但只能在一个地方定义,不然就会出现重定义。大部分函数默认是外部链接,而inline函数默认为内部链接。也就是说inline函数只能在本文件中使用,对其他文件是不可见的。一般我们使用某个类的时候,都是在文件中加上该类的头文件,以便我们可以使用该类的接口。而我们类的成员函数的实现都是放在相应的.cpp文件中的,而在.h文件中声明。这样我们便可以通过.h文件中的成员函数的声明找到其定义,继而使用成员函数了。但如果将inline函数放在.cpp文件中,那么其只对.cpp文件有效,这样我们就无法访问它了。所以我们将其放在类的声明的头文件中,这样通过包含该头文件来使用它。

  下面写个实际的例子来说明一下,我先把内联函数放到类声明的头文件中:

  /*test.h*/

  #ifndef TEST_H

  #define TEST_H

  #include <iostream>

  using std::cout;

  using std::endl;

  class test

  {

  public:

  test():x(10){}

  inline void print();

  void display (int y);

  private:

  int x;

  };

  void test::print()

  {

  cout << x << endl;

  }

  #endif

  /*test.cpp*/

  #include <iostream>

  #include "test.h"

  using std::cout;

  using std::endl;

  void test::display(int y)

  {

  cout << x * y << endl;

  }

  /*main.cpp*/

  #include <iostream>

  #include "test.h"

  using namespace std;

  int main()

  {

  test T;

  T.display(10);

  T.print();

  system("pause");

  return 0;

  }

  运行结果正常,下面来看看将内联函数放到.cpp中去:

  /*test.h*/

  #ifndef TEST_H

  #define TEST_H

  #include <iostream>

  using std::cout;

  using std::endl;

  class test

  {

  public:

  test():x(10){}

  inline void print();

  void display (int y);

  private:

  int x;

  };

  #endif

  /*test.cpp*/

  #include <iostream>

  #include "test.h"

  using std::cout;

  using std::endl;

  void test::print()

  {

  cout << x << endl;

  }

  void test::display(int y)

  {

  cout << x * y << endl;

  }

  测试函数和上面的main.cpp是一样的。这是出现了错误:

  error LNK2019:无法解析的外部符号 "public: void __thiscall test::print(void)" (?print@test@@QAEXXZ),该符号在函数 _main 中被引用。如果我将测试函数改为:

  int main()

  {

  test T;

  T.display(10);

  //T.print();

  system("pause");

  return 0;

  }

  那么运行结果正常。从此可以得出结论:内联函数放在头文件或者.cpp中都是没有错的,但如果我们需要在程序中访问它,那么就必须将其放在头文件中。
知识就是力量,别人学用知识来赚钱的成本低,在达内学习到编程是铸造梦想的地方,如果你喜欢编程,这里,有我们共同语言,共同的故事,共同的梦想!
(责任编辑:广州达内)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值