今天复习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;
}

运行结果正常,下面来看看将内联函数放到.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中都是没有错的,但如果我们需要在程序中访

问它,那么就必须将其放在头文件中。

转载自《

C++类的内联成员函数应放在哪

C++类的内联成员函数应放在哪相关推荐

  1. c++ 类的内联成员函数

    c++ 类的内联成员函数 1.什么是内联函数 在类的声明内部声明和定义的函数叫做内联成员函数,如下面例子,函数setA是普通的成员函数,函数setB是隐式的内联函数,函数setC是显式的内联函数. / ...

  2. 抽象数据类型(顺序栈)、断言、包含头文件、内联函数、非内联成员函数[C++ In Action][4]...

    1. C++中的接口与实现思想, 即类的定义.数据成员的定义.函数原型在接口文件中进行, 实现代码放在实现文件中 2. 函数调用开销:调用前要先保存寄存器,并在返回点恢复:复制实参:程序必须转入一个新 ...

  3. 类的数据,成员函数,声明

    类的数据成员 在类中声明数据成员 类的数据成员的声明类似于普通变量的声明.如果一个类具有多个同一类型的数据成员,则这些成员可以在一个成员声明中指定. class Cube { //Cube类表示立方体 ...

  4. 在类内定义成员函数、在类外定义成员函数、计算长方体的体积【C++面向对象编程类的使用经典案例】

    文章目录 一.在类内定义成员函数 二.在类外定义成员函数(使用符号::) 三.计算3个长方体的体积(class成员函数) 一.在类内定义成员函数 #include <iostream> u ...

  5. 类的定义,成员函数和内置成员函数

    目录 类的定义: 类的权限修饰符: 类定义对象的方法: 类成员函数: 成员函数的存储方式: 对象成员的引用: 类的定义: 类是对象的抽象,而对象是类的具体实例: 类是抽象的,不占用内存:对象是具体的, ...

  6. 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针

    文章目录 类的概念 struct class class和struct的区别是什么呢? 类中成员函数的两种定义方式 声明和定义都在类中 声明和定义分离 类的访问控制和封装 类的封装特性 类的大小 结构 ...

  7. SQL Server内联表值函数

    In this article series, we will find basics and common usage scenarios about the inline table-valued ...

  8. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  9. python类的成员函数_Python实现动态添加类的属性或成员函数的解决方法

    某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或 ...

最新文章

  1. 在c#中调用windows脚本的方法
  2. LeetCode实战:买卖股票的最佳时机 II
  3. Ajax原理以及优缺点
  4. 【Linux】cp命令
  5. Linux下通用的Makefile
  6. python类的使用(类定义,构造器,类属性,方法)
  7. Vue通过build打包后 打开index.html页面是空白的
  8. C语言程序设计 练习题参考答案 第八章 文件(2)
  9. 计算机网络教学方式探讨论文,学生老师论文,关于关于高中计算机网络教学效率提升相关参考文献资料-免费论文范文...
  10. 2010.06.04 电影推荐
  11. 21天学通python-21天学通Python PDF 高清版
  12. P1081 开车旅行
  13. linux命令4--rmrmdir
  14. 应邀参加51CTO专家座谈门诊——驱动开发技术探析【2008.11.20在线】
  15. 【图论】Floyd算法求任意两点间最短路
  16. ADO.NET Entity Framework 4.1 中的代码优先
  17. c 创建mysql实体模型_ADO.Net实体数据模型添加DB-First/Code First报错
  18. ncsi信号测试软件,02-附录
  19. php+mysql+H5砸金蛋、九宫格、翻翻乐、扭蛋机,开盲盒抽奖程序模板
  20. 在office中插入特殊符号方框带√

热门文章

  1. TCP/IP(二):IP协议
  2. 给页面加速,干掉Dom Level 0 Event
  3. 第十七章 我国农业科学技术
  4. 闭包应用之延迟函数setTimeout
  5. Navigation Drawer介绍
  6. Interactive Reflection Editing (SIGGRAPH ASIA 09)
  7. 博客园的BLOG也申请了
  8. Vue.js使用-http请求
  9. HTTP --- HTTP2小结
  10. egg --- 配置连接mysql 创建模型 插入数据