【Deep C (and C++)】深入理解C/C++(3)(三)

2014-11-24 12:34:45 · 作者: · 浏览: 5

~A() { delete[] v; }
//...
private:
A(const A&);
A& operator=(const A&);
//...
B* v;
int sz_;
};

第二个候选者说:恩,有了初始化列表。但是,你有没有注意到由此有产生了新的问题?

你编译的时候使用了-Wall选项吗?你应该使用-Wextra、-pedantic还有-Weffc++选项。如果没有警告出现,你可能没有注意到这里发生的错误。但是如果你提高了警告级别,你会发现问题不少。

一个不错的经验法则是:总是按照成员被定义的顺序来书写初始化列表,也就是说,成员按照自己被定义的顺序来呗初始化。在这个例子中,当v(new B[sz_])执行的时候,sz_还没有被定义。然后,sz_被初始化为sz。

事实上,C++代码中,类似的事情太常见了。

你于是把代码修改为:


#include "B.hpp"

class A
{
public:
A(int sz):v(new B[sz]), sz_(sz) { }
~A() { delete[] v; }
//...
private:
A(const A&);
A& operator=(const A&);
//...
B* v;
int sz_;
};

第二个候选者:现在好多了。还有什么需要改进的吗?接下来我会提到一些小问题。。。

C++代码中,看到一个光秃秃的指针,不是一个好的迹象。很多好的C++程序员都会尽可能的避免这样使用指针。当然,例子中的v看起来有点像STL中的vector,或且差不多类似于此的东西。

对于你的私有变量,你貌似使用了一些不同的命名约定。在此,我的看法是,只要这些变量是私有的,你爱怎么命名就怎么命名。你可以使得你的变量全部以_作为后缀,或且遵循微软命名规范,m_作为前缀。但是,请你不要使用_作为前缀来命名你的变量,以免和C语言保留的命名规范、Posix以及编译器的命名规则相混淆:)

摘自 Rockics的专栏