类设计前首先需要确定的是,该类所实例化的对象是值语义还是引用语义。值语义 一般用于非独占性资源对象, 表示该对象可以像int 一样的工作,可以任意的拷贝和重新赋值,而不会引起资源泄漏或者切割(指部分资源释放而部分泄漏)。引用语义一般用于独占性资源封装 对象 ,表示该对象不允许拷贝和重新赋值。从语法的角度上来说, 以下代码对值语 义是有效的,而对引用语义是无效的 :
CMyObject a,c;
CMyObject b(a); //值语义有效,引用语义无效
c = a; //值语义有效,引用语义无效
注意:假如以上语句有效并成功执行,但在执行代码后 ,a对象状态发生了变化,则该对象类语法上表现为值语义,而本质上还是引用语义。如 std::autoptr 。
引用语义与 值语义应用的 基本规则如下 :
1、尽量使对象实现值语义而不是引用语义。引用语义对象不能使用在 stl 容器中。
2、 对系统 独占性 资源封装的类 可以使用 引用语义。如打印机封装类,屏幕桌面类等。
3、通过声明而不定义拷贝构造函数和赋值操作符,显示的定义引用语义。
4、通过引用计数技术,可以使得原本是引用语义的对象实现为值语义对象。
5、基类对象应该禁止值语义,但提供 Clone 方法,进行对象复制。
引用语义语法实现如下:
class CMyObject
{
public:
typedef CMyObject my_type;
...
public:
//拷贝构造函数 ( 声明而不定义,禁止值语义 )
CMyObject(const my_type& rhs);
//赋值操作符重载 ( 声明而不定义,禁止值语义 )
my_type& operator=(const my_type& rhs);
....
};
值语义语法实现如下:
class CMyObject
{
public:
typedef CMyObject my_type;
...
public:
//拷贝构造函数
CMyObject(const my_type& rhs) {...}
//赋值操作符重载 ( 声明而不定义,禁止值语义 )
my_type& operator=(const my_type& rhs)
{
my_type aTemp(rha);
Swap(aTemp);
}
void Swap(my_type& rhs){...}
....
};
胡乐秋
2010/8/3 于长沙
http://blog.youkuaiyun.com/hlqyq