赋值操作符概要

来源:互联网 发布:沈阳居住证网络查询 编辑:程序博客网 时间:2024/05/16 18:04

一个类默认有一个赋值函数,类似这样的:

classtype& operator = (const classtype&);


这个赋值函数也就是一个简单的= 操作符的重载形式,当你要将一个对象赋值给另一个对象时调用

有关赋值函数,有以下概要问题:


(以string类为例)


class string{public:string& operator = (const string& s);private:char *data;};


1.错误的定义形式

string& operator = (const string& s){delete [ ] data;data = new char[strlen(s.data)+1];strcpy(data,s.data);return *this;}



因为没有处理自己本身赋值给自己的情况,在这种情况下,this 和 s 指向同一对象,程序运行会down掉。


2,正确的定义形式

string& operator = (const string& s){if(this != &s){delete [ ] data;data = new char[strlen(s.data)+1];strcpy(data,s.data);}return *this;}


在这里只要加上if判断是否是自己赋值给自己就ok了,如果是自己赋值给自己,就简单的返回this.


3,正确的定义形式

string& operator = (const string& s){ char *newdata=new char[strlen(s.data)+1];strcpy(newdata,s.data);delete [ ] data;data = newdata;return *this;}

这个方法就是利用中间变量将旧的目标值保存起来,知道赋值操作完成为止。


如果你的程序没有必要用到这个赋值函数,直接将其声明为私有即可

private:string& operator = (const string &);



也可以利用一个宏搞定:

#define DISALLOW_ASSIGN(type) private: \type& operator = (const type&);


class string

{

public :

//some functions

DISALLOW_ASSIGN(string);

};








0 0
原创粉丝点击