C++类的内联成员函数应放在哪
2015-11-15 10:50
363 查看
今天复习C++ Primer的时候,看到了关于C++类的内联成员函数的放置,应该放在头文件中。那么这到底是为什么
呢?仅仅是一种代码规范问题还是必须这样做呢?
下面我就来讲讲我自己的理解吧。要彻底理解这个问题,首先就要了解下函数的声明和定义了。我们知道,函数可以
在多处声明,但只能在一个地方定义,不然就会出现重定义。大部分函数默认是外部链接,而inline函数默认为内部链
接。也就是说inline函数只能在本文件中使用,对其他文件是不可见的。一般我们使用某个类的时候,都是在文件中加
上该类的头文件,以便我们可以使用该类的接口。而我们类的成员函数的实现都是放在相应的.cpp文件中的,而在.h
文件中声明。这样我们便可以通过.h文件中的成员函数的声明找到其定义,继而使用成员函数了。但如果将inline函数
放在.cpp文件中,那么其只对.cpp文件有效,这样我们就无法访问它了。所以我们将其放在类的声明的头文件中,这
样通过包含该头文件来使用它。
下面写个实际的例子来说明一下,我先把内联函数放到类声明的头文件中:
运行结果正常,下面来看看将内联函数放到.cpp中去:
测试函数和上面的main.cpp是一样的。这是出现了错误:
error LNK2019: 无法解析的外部符号 "public: void __thiscall test::print(void)" (?print@test@@QAEXXZ),该符号在函
数 _main 中被引用。如果我将测试函数改为:
那么运行结果正常。从此可以得出结论:内联函数放在头文件或者.cpp中都是没有错的,但如果我们需要在程序中访
问它,那么就必须将其放在头文件中。
转载自《
》
呢?仅仅是一种代码规范问题还是必须这样做呢?
下面我就来讲讲我自己的理解吧。要彻底理解这个问题,首先就要了解下函数的声明和定义了。我们知道,函数可以
在多处声明,但只能在一个地方定义,不然就会出现重定义。大部分函数默认是外部链接,而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++类的内联成员函数应放在哪
》
相关文章推荐
- 《并查集》hdu acm 5.1.6 c++ set
- Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
- 12.c/c++程序员面试宝典-异常与错误
- C++11实现模板化(通用化)RAII机制
- [C++]查找文件中的一串字符串
- iOS基础知识:C语言字符串及常用方法和函数
- C语言经典算法大全
- VC++ 19 (VS2015) 编译器系统环境变量配置
- C++的iostream标准库介绍+使用详解(转)
- C++11新标准:constexpr关键字
- C/C++文件输入输出操作——FILE*、fstream、windowsAPI
- 《并查集》hdu acm 5.1.7 c++ map的使用
- VIM的一些自己的使用tips(5年前整理的,看到后热泪盈眶)
- C++ 最常见的显示使用this 指针场景
- effective c++尽量少做转型动作(1)
- C++新手1024.cpp试制
- 软件工程(C编码实践篇)学习总结
- C语言
- 关键字static在c与c++中的区别。
- c语言的数组