C++运算符重载赋值运算符

自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。

赋值运算符重载函数的定义与其它运算符重载函数的定义是差不多的。

下面我们以实例说明如何使用它,代码如下:

//程序作者:管宁//站点:www.cndev-lab.com//所有稿件均有版权,如要转载,请务必著名出处和作者#include <iostream>using namespace std;class Internet{    public:        Internet(char *name,char *url)        {            Internet::name = new char[strlen(name)+1];            Internet::url = new char[strlen(url)+1];            if(name)            {                strcpy(Internet::name,name);            }            if(url)            {                strcpy(Internet::url,url);            }        }        Internet(Internet &temp)        {            Internet::name=new char[strlen(temp.name)+1];            Internet::url=new char[strlen(temp.url)+1];            if(name)            {                strcpy(Internet::name,temp.name);            }            if(url)            {                strcpy(Internet::url,temp.url);            }        }        ~Internet()        {            delete[] name;            delete[] url;        }        Internet& operator =(Internet &temp)//赋值运算符重载函数        {            delete[] this->name;            delete[] this->url;            this->name = new char[strlen(temp.name)+1];            this->url = new char[strlen(temp.url)+1];            if(this->name)            {                strcpy(this->name,temp.name);            }            if(this->url)            {                strcpy(this->url,temp.url);            }            return *this;        }    public:        char *name;        char *url;};int main(){    Internet a("中国软件开发实验室","www.cndev-lab.com");    Internet b = a;//b对象还不存在,所以调用拷贝构造函数,进行构造处理。    cout<<b.name<<endl<<b.url<<endl;    Internet c("美国在线","www.aol.com");    b = c;//b对象已经存在,所以系统选择赋值运算符重载函数处理。    cout<<b.name<<endl<<b.url<<endl;    system("pause");}

上例代码中的Internet& operator =(Internet &temp)就是赋值运算符重载函数的定义,内部需要先delete的指针就是涉及深拷贝问题的地方,由于b对象已经构造过,name和url指针的范围已经确定,所以在复制新内容进去之前必须把堆区清除,区域的过大和过小都不好,所以跟在后面重新分配堆区大小,而后进行复制工作。

在类对象还未存在的情况下,赋值过程是通过拷贝构造函数进行构造处理(代码中的Internet b = a;就是这种情况),但当对象已经存在,那么赋值过程就是通过赋值运算符重载函数处理(例子中的b = c;就属于此种情况)。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索url
, strcpy
, strlen
, 函数
, 函数重载
, 拷贝
, 赋值运算符重载
, 赋值问题
, 赋值
, 运算符重载
, 运算符
, 重载new
, internet
name
赋值运算符重载、赋值运算符重载函数、赋值运算符的重载、结构体重载赋值运算符、c 运算符重载,以便于您获取更多的相关知识。

时间: 2024-12-30 19:31:15

C++运算符重载赋值运算符的相关文章

c++-C++ list赋值和类的运算符重载

问题描述 C++ list赋值和类的运算符重载 刚刚发现了个问题,一直卡着我 class CA { public: CA(){} ~CA(){} public: VOID operator = ( CA& msg ) { dwvalue = msg.dwvalue; } private: DWORD dwvalue; }; VOID Fuck1( OUT list& bb ) { list< CA > aa; CA a; CA b; aa.push_back(a); aa.pu

C++基础之重载赋值运算符

  为了解决上面的问题,我们应该写一个特殊的赋值运算符函数来处理这类问题.当需要为同一个类的两个对象相互赋值时,就可以重载运算符函数.这个方法可以解决类的赋值和指针的释放. 下面的程序中,类中的赋值函数用new运算符从堆中分配了一个不同的指针,该指针获取赋值对象中相应的值,然后拷贝给接受赋值的对象. 在类中重载赋值运算符的格式如下: void operator = (const Date&) 后面我们回加以改进.目前,重载的运算符函数的返回类型为void.它是类总的成员函数,在本程序红,是Dat

C#——运算符重载和索引器

       一.什么是运算符?        所谓运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型.自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数.        下面是个小例子: namespace 运算符重载 { class Program { static

《C++语言基础》实践项目——运算符重载(一)

返回:贺老师课程教学链接 [项目1-实现复数类中的运算符重载](1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(const Complex &c2); Complex operator-(const Complex &c2); Com

2013级C++第8周(春)项目——运算符重载

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1]实现复数类中的运算符重载(1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(C

C02-程序设计基础提高班(C++)第11周上机任务-运算符重载

第11周:阅读教材第10章(p314-346),掌握用运算符重载解决问题,完成第11周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) [任务1]实现复数类中的运算符重载定义一个复数类重载运算符+.-.*./,使之能用于复数的加减乘除.(1)方案一:请用类的成员函数完成运算符的重载: class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Comple

C++上机实验三:运算符重载

#include <iostream> using namespace std; #ifndef CCOMPLEX_H #define CCOMPLEX_H class CComplex { public: CComplex(float r = 0.0f, float i = 0.0f): real(r), imag(i) { cout << "默认构造函数调用\n"; } CComplex(const CComplex & src); virtual

详解C++语言中的加法运算符与赋值运算符的用法_C 语言

加法运算符:+ 和 -语法 expression + expression expression – expression 备注 相加运算符为: 加 (+) 减 (–) 这些二进制运算符具有从左至右的关联性. 相加运算符采用算术或指针类型的操作数.加法 (+) 运算符的结果是操作数之和.减法 (–) 运算符的结果是操作数之差.如果一个操作数是指针或两个操作数都是指针,则它们必须是指向对象的指针,而不是指向函数的指针.如果两个操作数都是指针,则结果没有意义,除非它们是指向同一数组中的对象的指针.

C++运算符重载规则详解_C 语言

C++允许重载的运算符和不允许重载的运算符 C++中绝大部分的运算符允许重载,具体规定见表 不能重载的运算符只有5个: .  (成员访问运算符) .*  (成员指针访问运算符) ::  (域运算符) sizeof  (长度运算符) ?:  (条件运算符) 前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof 运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征. C++运算符重载的规则 C++对运算符重载定义了如下几条规则. 1) C++不允许用户自己定义新的