Effective C++条款53

来源:互联网 发布:下载先锋网络电视 编辑:程序博客网 时间:2024/05/04 10:10

不要轻忽编译器的警告

编译器的警告对于有些程序员来说并不在意。他们认为警告并不威胁程序或者对程序来说没有什么太大的副作用。然而,这种想法在编程的时候可能会付出很大的代价。
如下例子:

class B{    public:        virtual void f() const;    };    class D: public B{    public:        virtual void f();    };

该段代码的程序员想让class D继承class B的f()函数,但是D中却没有声明为const。编译器不会报错,可能会给如下警告,如下

warning: D::f() hides virtual B::f()

你或许会想,这正是我们想做的事。但是编译器在试图告诉你B::f并没有在D中重新声明,而是被遮掩了。如果忽略这个警告,比如导致错误行为。此时多态性会受到威胁。
如下代码:

#include<iostream>using namespace std;class B{public:    virtual void f() const{ cout << "class B" << endl; };};class D : public B{public:    virtual void f(){ cout << "class D" << endl; };};int main(){    B *b;    B b1;    D d1;    b = &b1;    b->f();//调用class B的f    d1.f();//调用class D的f    b = &d1;    b->f();//调用class B的f    return 0;}

从编译器的警告中获得经验,学会了解警告信息和它们看起来的意义并不十分相同。在最高警告级别下没有任何警告的程序是最理想的,但是对警告欧了深刻理解,可以选择忽略某些警告信息。但是一定记住在忽略这个警告之前,一定要了解它的真实意图。

警告信息和编译器相关,不同的编译器有不同的警告标准。例如上面代码中的函数遮掩在另一个编译器编译,可能没有任何警告。

1 0