Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4566346
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: C/C++

2006-10-12 15:31:07

只要是用户定义的类或结构,都应能进行赋值运算。
struct S
{
int a;
int b;
} ;
 
S  A,B;
A=B;    //正确。
 
对任何类,象拷贝构造函数一样,C++也默认提供赋值运算符。但要区别拷贝构造函数和赋值运算符。
void  fn(MyClass &mc)
{
   MyClass newMc=mc;     //这是拷贝构造函数
 
   newMc=mc;             //这是赋值运算符
 
}
 
当拷贝构造函数执行时,newMc对象还不存在,拷贝构造函数起初始化的作用。
当赋值运算符在newMc上执行时,它已经是一个MyClass对象。
 
在拷贝构造函数中,我们碰到浅拷贝和深拷贝的问题。赋值运算符也同样,什么时候浅拷贝不合适,就应提供成员赋值运算符。

//**********************

//** ch18_7.cpp **

//**********************


#include <string.h>
#include <iostream.h>

class Name{
public:
  Name(){ pName = 0; }
  Name(char* pn){ copyName(pn); }
  Name(Name & s){ copyName(s.pName); }
  ~Name(){ deleteName(); }
  Name & operator =(Name & s) //赋值运算符

  {
    deleteName();
    copyName(s.pName);
    return *this;
  }
  void display(){ cout << pName << endl; }
protected:
  void copyName(char* pN);
  void deleteName();
  char* pName;
};

void Name::copyName(char* pN)
{
  pName = new char[strlen(pN) + 1];
  if(pName)
    strcpy(pName, pN);
}

void Name::deleteName()
{
  if(pName){
    delete pName;
    pName = 0;
  }
}

int main()
{
  Name s("claudette");
  Name t("temporary");
  t.display();
  t = s; //赋值

  t.display();
}

 

在t=s赋值过程中,通过调用delteName(),原先名字占用的空间还给堆,再另外调用

copyName()从堆中分配新存储区去存储新名字。

而拷贝构造函数不需要调用deleteName(),因为刚创建时,还没有分配存放名字的堆空间。

 

阅读(3137) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~