C++类设计思考(二):值语义与引用语义

类设计前首先需要确定的是,该类所实例化的对象是值语义还是引用语义。值语义 一般用于非独占性资源对象, 表示该对象可以像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.csdn.net/hlqyq

你可能感兴趣的:(C++,c,工作,2010)