怎么写好一个C++的类(一)防止头文件重复包含

  今天,我用一个简单的主题,写好一个C++类来开篇作为我在博客园写的第一篇随笔吧。

  “怎么写好一个C++的类”这个主题是不是太小了,写一个类,谁还不会啊。呃,,,我发现写一个C++类是很简单,但是很多人却写不好,特别是一些刚从学校和培训班出来的同学,写出来的类,惨不忍睹。。。(其实博主刚从学校出来时候也这样,哈哈,没有歧视,只是大家成长都要一个过程)我本来以为这个主题比较小,就是最多几篇文章的事,但是开始写了,构思一下,没有十篇文章,还真说不完。。。(什么,用一篇很长很长的文章讲完?算了吧,我还没这种自虐倾向,而且也没时间啊,要上班,要提升自己。。。)

  好了,废话少说,先上一个最简单的类,看代码首先是头文件person.h(对了,我就是想创建一个人,毕竟很难想到示例,但是我平时工作的例子不能用,那些是行业机密,怕被老总找上门,那就尴尬了。。。):

 1  #ifndef _Person_H
 2  #define _Person_H
 3     
 4 class Person  
 5  {   
 6 public:       
 7      Person(); 
 8      
 9     ~Person();
10                                                                              
11  private:      
12  };  
13      
14  #endif

  然后是person.cpp文件

 1 #include <iostream>                  
 2 #include "person.h"                  
 3            
 4 using std::cout;
 5 using std::endl;                                                            
 6            
 7 Person::Person()
 8 {          
 9     cout << "create a person" << endl;
10 }          
11            
12 Person::~Person()                    
13 {          
14     cout << "release a person" << endl;
15 }

  然后是可执行文件main.cpp

1 #include <iostream>
2 #include "person.h"
3 using namespace std;
4 
5 int main()        
6 {                 
7     Person person;                                                          
8     return 0;     
9 } 

  OK!接下来先编译运行吧!

   好!首先从最简单的说起,在头文件person.h文件为什么加上#ifndef、#define和#endif预编译语句呢?不加又怎样?

  先说原因,再给示例,原因是防止头文件重复包含,#ifndef _Person_H_意思是如果没有定义_Person_H_的宏,就#define _Person_H_定义_Person_H_宏,一旦有了这个宏,源文件再包含这个头文件时候,就不会进入这个#ifndef范围,重复定义相同的变量而是直接从#endif后面开始运行,当然#endif后面没有代码了,这个文件可以忽略了,下面给两个例子吧!

  首先把原来的person.h中的预编译语句去掉。

 1 //#ifndef _Person_H
 2 //#define _Person_H
 3   
 4 class Person
 5 { 
 6 public:
 7     Person();
 8   
 9      ~Person();
10    
11  private:
12  };
13    
14  //#endif

  然后在main.cpp文件中重复包含person.h头文件

 1 #include <iostream>
 2 #include "person.h"
 3 #include "person.h"                                                             
 4 using namespace std;
 5                      
 6 int main()           
 7 {                    
 8     Person person;
 9     return 0;        
10 }  

  编译结果:

  看到了吧,编译结果报错,重复定义了,当然我们去掉注释,还原原来的预编译头,即使重复包含了头文件,也不会出现重复定义的错误了。

  当然有人会说,“我才没有那么蠢,在同一个文件包含同一个头文件两次呢”,这样啊,那如果在不同文件包含头文件两次呢?看下面例子。

  新加一个test.h文件,只加#include "person.h"一个语句:

1 #ifndef _TEST_H   
2 #define _TEST_H   
3                      
4 #include "person.h"                                                             
5                      
6 #endif 

  然后用main.cpp文件包含test.h文件:

 1 #include <iostream>
 2 #include "person.h"
 3 #include "test.h"                                                               
 4 using namespace std;
 5                  
 6 int main()       
 7 {                
 8     Person person;
 9     return 0;  
10 }  

  编译:

   又是重复包含的错误。

  或许又有人争辩了,我从来不加这个,或者有些文件不加,也没有出现问题啊。我只想扔你一句,那是因为你写的代码太简单了。。。我工作日常,一个C++项目上G的代码的都很常见,所以要无比注重程序细节,养成好习惯,否则出问题,找bug能死人,哈哈。。。

猜你喜欢

转载自www.cnblogs.com/qiuquanguan/p/11563498.html