问题:
investment *pinv=createinvesment();
...
delete pinv;//释放所指对象 可能资源泄漏
方法:智能指针
把资源放进对象内,依靠析构函数自动
构造函数获得资源,析构函数中释放资源
智能指针:auto_ptr,其析构函数自动对其所指对象调用delete
auto_ptr<investment>pinv(createinvestment());
或者引用型指针shared_ptr
类中数据成员原来使用指针-----》放入智能指针
-----》深拷贝—编写拷贝函数
对原始资源的访问可经由
显式转换 比较安全
隐式转换 对用户方便
string *stringarray=new string[100];
...
delete stringarray;此时未定义的行为 删除一个对象调用其析构函数
后面的99个不能删除,其析构函数不能被调用
delete []stringarray;删除一个数组,倒叙调用析构函数
shared_ptr<widget> pw 可以做函数参数,返回值
防止资源泄漏
(1)不产生副本
传值:以实际参数的副本为初值,不高效
返回值:函数返回值得一个复件 --伴有额外的构造函数,析构函数,不高效
(2)解决切割问题---传cosnt引用代替传值
传值不昂贵的对象:内置类型和STL的迭代器和函数对象
例如:返回有理数的乘积
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);
}
否则--破坏封装;如果成员变量改变,破坏与此有关的所有函数
protected并不比public更具偶封装性
可以增强封装性
成员函数---封装性低,,增加了访问类内private变量的函数数量
注重反应时---随时返回平均值
平均值不频繁时----需要时才计算
成员变量的封装性域成员变量的内容改变时所破坏的代码量成反比
友元函数与成员函数对成员变量的访问权限一样