今天,我用一个简单的主题,写好一个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能死人,哈哈。。。