More Effective 35个有效
来源:互联网 发布:阿里巴巴 淘宝 便宜 编辑:程序博客网 时间:2024/06/06 18:28
1,仔细区分pointers和reference
当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法无法使用pointer时,你就应该选择reference,任何其他时候请采用Pointers.
2,最好使用c++转型操作符
3,绝对不要以多态的方式处理数组
class BST{}
class BalenceBst : public BST{}
void print(const BST array[],int num)
{
for(int i = 0;i < num;++i)
cout << array[i] << endl;
}
如果将balance传递下去会有问题, array[i] = array + i*sizeof(数组中的对象) 编译器会当成bst的大小去进行运算当然会出错,同理删除也一样:
void deleteArray(BST array[]){ delete[] array; }
但是delete [] array 会被解析成
for(i = num;i >= 0;--i){
array[i].BST::~BST();
}
//这样是个行为错误的循环代码,导致未定义的结果
所以数组和多态千万不要混用
4:非必要不要提供default constructor
5:对定制的类型转换操作保持警觉
两种函数允许编译器执行隐式转换1,单自变量的Constructor
1 class Name{
public:
Name(String& s);//可以把string 转换成string
}
好的做法:
使用explicit,如果没有explicit关键字也有一种做法,示例如下:
template <class T>
class Array{
public:
class Arraysize{
Arratsize(int Ssize):size_(Ssize){}
int size(void){return size;}
}
Array(ArraySize size);
};
Array<int> i(10);//ok
但是以下情况就会显出效果:
Array<int> a(10);
Array<int> b(10);
for(int i = 0;i < 10;++i)
{
if(a == b[i])//会报错,编译器不会将Int转换成arraysize,再将arraysize转换成array,两次的转换是不可以的.
}
2 隐式类型转换
class Rational{
operator double() const;// 将rational 转换成double
}
Rational r(1,0.5);
double d = 0.6 * r;//编译器会将r换成double然后执行乘法运算
但是好的做法是提供一个asDouble()函数用来代替隐式类型转换,犹如string提供的c_str()函数,
编写string类的人想必是很有经验的程序员了,他们也是提供一个显示的函数用来转换,巧合吗?不是吧.
所以建议以功能相同的函数来代替.
6,区分increment/decrement操作符的前置(prefix)和后置形式(postfix)
class Uint{
public:
Uint& operator++(){
++i;
return *this;
}
const Uint operrator++(int){
Uint ui = *this;
++(*this);
return ui;
}
private:
int i;
};
注意:后置式操作符的实现应该以前置式操作符的实现为基础,这样就只用维护前置式的实现即可.