C++类的内联成员函数应放在哪
今天复习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++类的内联成员函数应放在哪相关推荐
- c++ 类的内联成员函数
c++ 类的内联成员函数 1.什么是内联函数 在类的声明内部声明和定义的函数叫做内联成员函数,如下面例子,函数setA是普通的成员函数,函数setB是隐式的内联函数,函数setC是显式的内联函数. / ...
- 抽象数据类型(顺序栈)、断言、包含头文件、内联函数、非内联成员函数[C++ In Action][4]...
1. C++中的接口与实现思想, 即类的定义.数据成员的定义.函数原型在接口文件中进行, 实现代码放在实现文件中 2. 函数调用开销:调用前要先保存寄存器,并在返回点恢复:复制实参:程序必须转入一个新 ...
- 类的数据,成员函数,声明
类的数据成员 在类中声明数据成员 类的数据成员的声明类似于普通变量的声明.如果一个类具有多个同一类型的数据成员,则这些成员可以在一个成员声明中指定. class Cube { //Cube类表示立方体 ...
- 在类内定义成员函数、在类外定义成员函数、计算长方体的体积【C++面向对象编程类的使用经典案例】
文章目录 一.在类内定义成员函数 二.在类外定义成员函数(使用符号::) 三.计算3个长方体的体积(class成员函数) 一.在类内定义成员函数 #include <iostream> u ...
- 类的定义,成员函数和内置成员函数
目录 类的定义: 类的权限修饰符: 类定义对象的方法: 类成员函数: 成员函数的存储方式: 对象成员的引用: 类的定义: 类是对象的抽象,而对象是类的具体实例: 类是抽象的,不占用内存:对象是具体的, ...
- 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针
文章目录 类的概念 struct class class和struct的区别是什么呢? 类中成员函数的两种定义方式 声明和定义都在类中 声明和定义分离 类的访问控制和封装 类的封装特性 类的大小 结构 ...
- SQL Server内联表值函数
In this article series, we will find basics and common usage scenarios about the inline table-valued ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
- python类的成员函数_Python实现动态添加类的属性或成员函数的解决方法
某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或 ...
最新文章
- 在c#中调用windows脚本的方法
- LeetCode实战:买卖股票的最佳时机 II
- Ajax原理以及优缺点
- 【Linux】cp命令
- Linux下通用的Makefile
- python类的使用(类定义,构造器,类属性,方法)
- Vue通过build打包后 打开index.html页面是空白的
- C语言程序设计 练习题参考答案 第八章 文件(2)
- 计算机网络教学方式探讨论文,学生老师论文,关于关于高中计算机网络教学效率提升相关参考文献资料-免费论文范文...
- 2010.06.04 电影推荐
- 21天学通python-21天学通Python PDF 高清版
- P1081 开车旅行
- linux命令4--rmrmdir
- 应邀参加51CTO专家座谈门诊——驱动开发技术探析【2008.11.20在线】
- 【图论】Floyd算法求任意两点间最短路
- ADO.NET Entity Framework 4.1 中的代码优先
- c 创建mysql实体模型_ADO.Net实体数据模型添加DB-First/Code First报错
- ncsi信号测试软件,02-附录
- php+mysql+H5砸金蛋、九宫格、翻翻乐、扭蛋机,开盲盒抽奖程序模板
- 在office中插入特殊符号方框带√