Code::Blocks 使用技巧.6-让编译器多读几本书:)

 虽然传统的那种纸质书,似乎越来越不受欢迎了……

但我个人还是喜欢读纸质书,为什么呢?

因为泡一杯咖啡,拉来转椅半躺上,抱上厚得可以防身的C++书籍,把自己关在小书屋里,那种感觉简直就是觉得自己已然成为了一位高级知识分子了——另外一种情况是开着电脑,瞪着大眼看屏幕……唉,感觉全无,只能是回到现实,发现自己不过是一个可怜的程序员。

 

前阵子从青岛飞回厦门,我就更装逼了,直接拿了机上的一份人民日报海外版(纯英文的那种),坐在中间的位置装得很慵懒地翻阅——其实看得非常吃劲——几次都将手指头移动不懂的单词上,以为会有小窗体弹出翻译内容……不管如何,装逼效果非常好,边上两位美女直接投给我敬佩的眼光,右边那位给我留了两个QQ号,左边那位和我一路聊到厦门,最后交换手机号……

 

这就是知识的力量! :B

 

编译器也是这样子啦! 想想一个没有读过 世界顶级C++开发权威之一的牛人Scott Meyers(点击转到其主页)的《Effective C++》和《More Effective C++》两本巨著的编译器,和一个有读过这两本著作的编译器相比,真是高下立见。

前面都是废话。

打开Code::Blocks(采用中文语言包的界面),主菜单“设置” -> “编译器与调试器” ,选中GCC编译器。然后配置其编译器选项:

Enable Effective-C++ warnings....

这样配置,是让所有以后在Code::Blocks新建的,采用gcc编译器的C++项目,都会使用这个选项。如果你只是想在个别项目中使用,那么可以在具体项目中做此配置(打开工程之后,主菜单:项目->构建选项)。

 

有了这个选项,会带来什么好处呢?我们先考一下自己:

Code:
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class Person  
  6. {  
  7. public:  
  8.     virtual void Say()  
  9.     {  
  10.         cout << "I am a person." << endl;  
  11.     }  
  12.       
  13.     ~Person()  
  14.     {  
  15.         cout << "bye-bye person." << endl;  
  16.     }  
  17. };  
  18.   
  19. class Beauty : public Person  
  20. {  
  21. public:  
  22.     Beauty()  
  23.         : _p (new int)  
  24.     {  
  25.           
  26.     }  
  27.       
  28.     ~Beauty()  
  29.     {  
  30.         delete _p;  
  31.     }  
  32.   
  33.    virtual void Say()  
  34.     {  
  35.         cout << "I am a beauty." << endl;  
  36.     }  
  37.       
  38.       
  39. private:  
  40.     int* _p;  
  41. };  
  42.   
  43. int main()  
  44. {      
  45.     return 0;      
  46. }  

以上代码存在哪些设计上的隐患呢? 语法是肯定没有问题的啦,一个没有读过书的编译器,肯定会听话地编译完以上代码。

但一个有读过的书的编译器,它会给出以下警告,带上简单翻译:

 

||=== Temp4Book, Debug ===|

main.cpp|7|warning: 'class Person' has virtual functions and accessible non-virtual destructor

(第7行,class Person拥有一个虚函数,可是它的析构函数不是虚的! 太可怕的设计错误了)

main.cpp|21|warning: 'class Beauty' has pointer data members

(第21行,class Beauty拥有一个指针数据成员,接下一行……)

main.cpp|21|warning:   but does not override 'Beauty(const Beauty&)'

(但是,你没有给Beauty定制拷贝构造函数!)

main.cpp|21|warning:   or 'operator=(const Beauty&)'

(同样,也没有重载它的赋值操作符!)

main.cpp|21|warning: 'class Beauty' has virtual functions and accessible non-virtual destructor

(第21行,class Beauty同样拥有一个虚函数,可是它的析构函数不是虚的! 原因在其基类上的,呵呵。)

||=== 已完成构建: 0 个错误, 5 个警告 ===|

 

你不信这些警告的重要性吗?可以买前面提到的那两本书,国内有出版。这里简单一例:

Code:
  1. void test()  
  2. {  
  3.       Beauty b1;  
  4.       Beauty b2=b1;  
  5. }  
严重问题发生了,你能知道问题在哪吗?来做一道试题测试一下吧:)
 
http://student.csdn.net/space.php?do=question&ac=detail&qid=1839
 

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

 如果您想与我交流,请点击如下链接成为我的好友: 
http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c

 

 

你可能感兴趣的:(c,gcc,delete,Class,编译器,destructor)