1、左值和右值
C++里定义:左值是即可出现在等号左边又可以出现在等号右边的变量(或者表达式);右值是只能出现在等号右边的变量(或表达式)。
对于C和C++基础类型中:右值都是不可修改的,也不能用Const 来修饰;但在C++中自定义的类型来讲,右值可以被成员函数修改。
2、关于智能指针auto_ptr,你了解多少?
包含在头文件memory中。
主要是为了解决“发生异常后导致内存泄漏”这个问题。
(源码摘抄供大家看看):
namespace std
{
template<class T> //类模板
class auto_ptr
{
private:
T* ap; //一般指针,,,而不是数组指针
public:
// constructor & destructor ----------------------------------- (1)
explicit auto_ptr (T* ptr = 0) throw() : ap(ptr){}
~auto_ptr() throw()
{
delete ap;
}
// Copy & assignment --------------------------------------------(2)
auto_ptr (auto_ptr& rhs) throw() :ap(rhs.release()) {}
template<class Y>
auto_ptr (auto_ptr<Y>& rhs) throw() : ap(rhs.release()) { }
auto_ptr& operator= (auto_ptr& rhs) throw()
{
reset(rhs.release());
return *this;
}
template<class Y>
auto_ptr& operator= (auto_ptr<Y>& rhs) throw()
{
reset(rhs.release());
return *this;
}
// Dereference----------------------------------------------------(3)
T& operator*() const throw()
{
return *ap;
}
T* operator->() const throw()
{
return ap;
}
// Helper functions------------------------------------------------(4)
// value access
T* get() const throw()
{
return ap;
}
// release ownership
T* release() throw()
{
T* tmp(ap);
ap = 0;
return tmp;
}
// reset value
void reset (T* ptr=0) throw()
{
if (ap != ptr)
{
delete ap;
ap = ptr;
}
}
// Special conversions-----------------------------------------------(5)
template<class Y>
struct auto_ptr_ref
{
Y* yp;
auto_ptr_ref (Y* rhs) : yp(rhs) {}
};
auto_ptr(auto_ptr_ref<T> rhs) throw() : ap(rhs.yp) { }
auto_ptr& operator= (auto_ptr_ref<T> rhs) throw()
{
reset(rhs.yp);
return *this;
}
template<class Y>
operator auto_ptr_ref<Y>() throw()
{
return auto_ptr_ref<Y>(release());
}
template<class Y>
operator auto_ptr<Y>() throw()
{
return auto_ptr<Y>(release());
}
};
}