好好爱自己!

C++成员函数实现在类定义中与在类定义外的区别(Windows下直接使用g++)

c++ 类的成员函数放在类的外面来实现的写法,探究一下。

原文: http://www.cnblogs.com/findumars/p/6143375.html

------------------------------------------------------------------------

在上篇文章《inline的另一用处》中,提到函数实现在类定义中与类定义外的区别。

    现在先看个实验:

    a.cpp:

   

[cpp] view plain copy
 
  1. #ifndef TEST_H  
  2. #define TEST_H  
  3. class A{  
  4.     public:  
  5.     int fun(int x){  
  6.     return (x*x+1000);  
  7. }  
  8. };  
  9. #endif  
  10.   
  11. void tt()  
  12. {  
  13. }  


b.cpp:

[cpp] view plain copy
 
  1. class A{  
  2.     public:  
  3.     int fun(int x);  
  4. };  
  5. void tt();    
  6. int yy()    
  7. {    
  8.     tt();   
  9.     A a;  
  10.     return a.fun(3);    
  11. }  
  12.       

将它们分别编译后再链接:

显示链接错误,因为b.cpp(b.o)中找不到A::fun(int)的引用。

将以上的a.cpp改为如下所示:

[cpp] view plain copy
 
  1. #ifndef TEST_H  
  2. #define TEST_H  
  3. class A{  
  4.     public:  
  5.     int fun(int x);  
  6. };  
  7. #endif  
  8. int A::fun(int x){  
  9.     return (x*x+1000);  
  10. }  
  11. void tt()  
  12. {  
  13. }  


    分别编译a.cpp和b.cpp为a.o和b.o后链接,显示链接成功。

    这样,第一次链接错误的原因就很明显了。

    结论:

    在类定义中的类成员函数实现有文件内部作用域,而在类定义外部的类实现有的是全局作用域。

 

http://blog.csdn.net/tobacco5648/article/details/7651408

posted @   立志做一个好的程序员  阅读(1553)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示