C++ 赋值运算符重载
“*=”的问题,相当混乱。。。感觉这个和算数运算符重载差别很大啊。。。要求:就是写一个简单的重载就好。。。遇到的题如下:编写一个复数类Complex,用成员函数来重载复合...
“*=”的问题,相当混乱。。。感觉这个和算数运算符重载差别很大啊。。。
要求:就是写一个简单的重载就好。。。
遇到的题如下:编写一个复数类Complex,用成员函数来重载复合运算符 “*=”,对两个复数进行乘运算。下面是自己写的代码,请结合题目,看下是错在哪里了(这是我参考+=的重载改了下得到的)。。。
#include <iostream>
using namespace std;
class Complex
{
private:
double real,im;
public:
Complex(double r,double i){real=r;im=i;}
Complex(){}
Complex operator+=(Complex &c2);
void display();
};
Complex Complex::operator*=(Complex &c2)
{
return Complex(real=c1.real*c1.real+c2.real*c1.real,im=2*c1.im*c2.im);
}
void Complex::display()
{
cout << "(" << real << + << im << "i" << ")" << endl;
}
int main()
{
Complex c1(1,2);
Complex c2(2,3);
Complex c3;
c3=c1*=c2;
c1.display();
c2.display();
c3.display();
return 0;
} 展开
要求:就是写一个简单的重载就好。。。
遇到的题如下:编写一个复数类Complex,用成员函数来重载复合运算符 “*=”,对两个复数进行乘运算。下面是自己写的代码,请结合题目,看下是错在哪里了(这是我参考+=的重载改了下得到的)。。。
#include <iostream>
using namespace std;
class Complex
{
private:
double real,im;
public:
Complex(double r,double i){real=r;im=i;}
Complex(){}
Complex operator+=(Complex &c2);
void display();
};
Complex Complex::operator*=(Complex &c2)
{
return Complex(real=c1.real*c1.real+c2.real*c1.real,im=2*c1.im*c2.im);
}
void Complex::display()
{
cout << "(" << real << + << im << "i" << ")" << endl;
}
int main()
{
Complex c1(1,2);
Complex c2(2,3);
Complex c3;
c3=c1*=c2;
c1.display();
c2.display();
c3.display();
return 0;
} 展开
3个回答
展开全部
下面我们以实例说明如何使用它,代码如下:
#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;就属于此种情况)。
#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;就属于此种情况)。
追问
麻烦看下问题补充。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <iostream>
using namespace std;
class Complex
{
private:
double real,im;
public:
Complex(double r,double i){real=r;im=i;}
Complex(){}
Complex operator*=(Complex &c2);
void display();
};
Complex Complex::operator*=(Complex &c2)
{
double d;
d=im;
return Complex(real=real*c2.real-d*c2.im,im=real*c2.im+c2.real*im);//这里先计算后面的了
}
void Complex::display()
{
cout << "(" << real << '+' << im << "i" << ")" << endl;
}
int main()
{
Complex c1(1,2);
Complex c2(2,3);
Complex c3;
c1.display();
c2.display();
c3=c1*=c2;
c3.display();
return 0;
}
using namespace std;
class Complex
{
private:
double real,im;
public:
Complex(double r,double i){real=r;im=i;}
Complex(){}
Complex operator*=(Complex &c2);
void display();
};
Complex Complex::operator*=(Complex &c2)
{
double d;
d=im;
return Complex(real=real*c2.real-d*c2.im,im=real*c2.im+c2.real*im);//这里先计算后面的了
}
void Complex::display()
{
cout << "(" << real << '+' << im << "i" << ")" << endl;
}
int main()
{
Complex c1(1,2);
Complex c2(2,3);
Complex c3;
c1.display();
c2.display();
c3=c1*=c2;
c3.display();
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询