C编程中,使用赋值运算符重载时有哪些

一般编译器默认的会给类提供了一个默认的赋值运算符重载函数,而默认的赋值运算符重载函数只是进行了简单的赋值操作。用代码演示如下所示:

#includeiostream#includestringusingnamespacestd;classPerson{public:  Person(){    id=0;    age=0;  }  Person(intid,intage){    this-id=id;    this-age=age;  }public:  intid;  intage;};voidtest(){  Personp1(10,20);  Personp2;  p2=p1;//默认的赋值运算符重载函数进行了简单的赋值操作  coutp2.id""p2.ageendl;}intmain(){  test();  system("pause");  returnEXIT_SUCCESS;}

还有一个需要注意的重点或是最易犯错的问题是:如若当类有成员指针时,需要在构造函数中申请堆区空间,在析构函数中释放堆区空间,这样的代码看似没问题,实则就会出现同一块空间被释放2次,就会造成内存泄漏,所以这时候利用重写赋值运算符重载函数也可以解决,当然,谈到了赋值运算符重载,当然用它来讲了。以下是利用重写赋值运算符重载函数的简单代码:

#define_CRT_SECURE_NO_WARNINGS#includeiostream#includestringusingnamespacestd;classPerson{public:  //申请堆区空间  Person(constchar*name){    pName=newchar[strlen(name)+1];    strcpy(pName,name);  }  //拷贝构造函数防止浅拷贝问题  Person(constPersonp){    if(pName!=NULL){      deletepName;      pName=NULL;    }    pName=newchar[strlen(p.pName)+1];    strcpy(pName,p.pName);  }  //重写赋值运算符重载函数  Personoperator=(constPersonper){    //1.不能确定pName指向的空间是否能装下per中的数据,所以先释放pName指向的空间    if(pName!=NULL){      deletepName;      pName=NULL;    }    //2.申请堆区空间,大小由per决定    pName=newchar[strlen(per.pName)+1];    //3.拷贝数据    strcpy(pName,per.pName);    //4.返回对象本身    return*this;  }  //析构函数  ~Person(){    if(pName!=NULL){      delete[]pName;      pName=NULL;    }  }  voidprintPerson(){    cout"Name="pNameendl;  }private:  char*pName;};voidtest(){  Personp1("小明");  Personp2("小华");  p1.printPerson();  p2.printPerson();  p1=p2;  cout"===经过赋值后的数据==="endl;  p1.printPerson();  p2.printPerson();}intmain(){  test();  system("pause");  returnEXIT_SUCCESS;}

运行后的结果是:

以上是赋值运算符重载的举的一个小例子,都是c++编程中最基础的知识点,当然运算符重载的知识点还有很多种,比如:加减号运算符,左移右移运算符,前置加加,后置加加,数组下标运算符重载等等,因为时间有限,不作具体一一介绍。

总结:在c++编程的赋值运算符重载函数中,有一个小问题,为什么要返回引用的问题?

voidtest01(){  Personp1("A");  Personp2("B");  Personp3("C");  p1=p2=p3;//p3赋值p2,p2赋值给p1  cout(p2=p3)endl;  coutp2endl;}

如果返回的是值,那么p2=p3这个表达式会产生一个新的对象,像这个表达式中:p1=p2=p3,而赋值运算符本来的寓意是p3赋值给p2,p2赋值给p1,也就是说p2=p3这个表达式要返回p2这个对象,所以要返回引用。基础很重要,如果有时间的,可以看一些入门的基础教材,跟着实操起来,进步也会快很多。




转载请注明:http://www.aierlanlan.com/grrz/3134.html