浅谈C++类的内联成员函数应放在那个文件
2013-04-19 14:38
309 查看
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持;转载: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中都是没有错的,但如果我们需要在程序中访问它,那么就必须将其放在头文件中。
知识就是力量,别人学用知识来赚钱的成本低,在达内学习到编程是铸造梦想的地方,如果你喜欢编程,这里,有我们共同语言,共同的故事,共同的梦想!
(责任编辑:广州达内)
今天复习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中都是没有错的,但如果我们需要在程序中访问它,那么就必须将其放在头文件中。
知识就是力量,别人学用知识来赚钱的成本低,在达内学习到编程是铸造梦想的地方,如果你喜欢编程,这里,有我们共同语言,共同的故事,共同的梦想!
(责任编辑:广州达内)
相关文章推荐
- C++类的内联成员函数应放在哪
- C++类的内联成员函数应放在哪
- C++类的内联成员函数应放在哪
- c++类的模板成员函数申明和实现必须放在一起
- C 类的内联成员函数应放在哪
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 浅谈C++类中的默认成员函数
- 模板类成员函数的定义和声明为什么要放在一个文件中
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- 5,将本章的例2.4改写为一个多文件的程序: (1)将类定义放在头文件arraymax.h中; (2)将成员函数定义放在源文件arraymax.cpp中; (3)主函数放在源文件filel.cpp中。
- 泛型编程注意不能将模板类的成员函数放在独立的实现文件中
- C++模板类成员函数最好和模板类声明一起放在同一个.h头文件里
- 将任务4的解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。
- 模板类成员函数的定义和声明为什么要放在一个文件中
- C++类的成员函数
- 内联成员函数应放在哪
- C++类成员函数指针,二级类成员函数指针知识点
- C++类对象内存模型与成员函数调用分析(下)
- C++类中的静态成员变量和静态成员函数的作用
- C++类中的static数据成员,static成员函数