effective C++ 阅读笔记 2

13  对象管理资源

问题:

investment *pinv=createinvesment();

...

delete pinv;//释放所指对象  可能资源泄漏

方法:智能指针

把资源放进对象内,依靠析构函数自动

构造函数获得资源,析构函数中释放资源

智能指针:auto_ptr,其析构函数自动对其所指对象调用delete

auto_ptr<investment>pinv(createinvestment());

或者引用型指针shared_ptr

14 资源管理类中小心coping行为

类中数据成员原来使用指针-----》放入智能指针

                        -----》深拷贝—编写拷贝函数

15 资源管理类中提供对原始资源的访问

对原始资源的访问可经由

显式转换  比较安全

隐式转换  对用户方便

16对new,delete要使用相同形式

string *stringarray=new string[100];

...

delete stringarray;此时未定义的行为  删除一个对象调用其析构函数

后面的99个不能删除,其析构函数不能被调用

delete []stringarray;删除一个数组,倒叙调用析构函数

17  new 产生的对象放入智能指针

shared_ptr<widget> pw 可以做函数参数,返回值

防止资源泄漏

20 以传递 const 引用代替传值

(1)不产生副本

传值:以实际参数的副本为初值,不高效

     返回值:函数返回值得一个复件  --伴有额外的构造函数,析构函数,不高效

(2)解决切割问题---传cosnt引用代替传值

传值不昂贵的对象:内置类型和STL的迭代器和函数对象

21返回对象时,别忘了返回其引用&

例如:返回有理数的乘积

friend const rational operator *(rational&lhs,rational &rhs);

返回值时----副本的代价

const rational& operator *(rational&lhs,rational &rhs)

{

rational result(lhs.n*rhs.n,lhs.d*rhs.d);

return result;//局部对象,调用其构造,析构函数,代价大

}

使用new rational----容易出现的问题:构造函数+资源泄漏

const rational& operator *(rational&lhs,rational &rhs)

{

rational* result=newrational(lhs.n*rhs.n,lhs.d*rhs.d);

return *result;//局部对象,调用其构造,析构函数,代价大

}

使用static-----容易出现的问题

const rational& operator *(rational&lhs,rational &rhs)

{

static rational result;

result=...;安全性差

return result;//局部对象,调用其构造,析构函数,代价大

}

例如:if((a*b)==(c*d))永远成立 

正确的写法:

必须返回新对象的函数----返回一个新对象

const rational& operator *(rational&lhs,rational &rhs)

{

return rational (lhs.n*rhs.n,lhs.d*rhs.d);

}

 

22 成员变量声明为private

否则--破坏封装;如果成员变量改变,破坏与此有关的所有函数

protected并不比public更具偶封装性

23 以非成员,非友元代替成员函数

可以增强封装性

成员函数---封装性低,,增加了访问类内private变量的函数数量

注重反应时---随时返回平均值

平均值不频繁时----需要时才计算

成员变量的封装性域成员变量的内容改变时所破坏的代码量成反比

友元函数与成员函数对成员变量的访问权限一样


你可能感兴趣的:(effective C++ 阅读笔记 2)