重载为类的成员函数
#include<iostream.h>classcomplex{public:complex(){real=imag=0;}complex(doubler,double...
#include <iostream.h>
class complex
{
public:
complex() { real=imag=0; }
complex(double r, double i)
{
real = r, imag = i;
}
complex operator +(const complex &c);
complex operator -(const complex &c);
complex operator *(const complex &c);
complex operator /(const complex &c);
friend void print(const complex &c);
private:
double real, imag;
};
inline complex complex::operator +(const complex &c)
{
return complex(real + c.real, imag + c.imag);
}
inline complex complex::operator -(const complex &c)
{
return complex(real - c.real, imag - c.imag);
}
inline complex complex::operator *(const complex &c)
{
return complex(real * c.real - imag * c.imag, real * c.imag + imag * c.real);
}
inline complex complex::operator /(const complex &c)
{
return complex((real * c.real + imag + c.imag) / (c.real * c.real + c.imag * c.imag),
(imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.imag));
}
void print(const complex &c)
{
if(c.imag<0)
cout<<c.real<<c.imag<<'i';
else
cout<<c.real<<'+'<<c.imag<<'i';
}
void main()
{
complex c1(2.0, 3.0), c2(4.0, -2.0), c3;
c3 = c1 + c2;
cout<<"\nc1+c2=";
print(c3);
c3 = c1 - c2;
cout<<"\nc1-c2=";
print(c3);
c3 = c1 * c2;
cout<<"\nc1*c2=";
print(c3);
c3 = c1 / c2;
cout<<"\nc1/c2=";
print(c3);
c3 = (c1+c2) * (c1-c2) * c2/c1;
cout<<"\n(c1+c2)*(c1-c2)*c2/c1=";
print(c3);
cout<<endl;
}
该程序的运行结果为:
c1+c2=6+1i
c1-c2=-2+5i
c1*c2=14+8i
c1/c2=0.45+0.8i
(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i
这是书上的一个例子,好长的啊!看着有点头晕
谁能不能用短一点的例子让我明白什么是运算符重载
还有上面的complex operator +(const complex &c);
complex operator -(const complex &c);
complex operator *(const complex &c);
complex operator /(const complex &c);
是什么意思?能解释一下上面程序在加分
complex operator -(const complex &c);
括号里的参数是什么意思 展开
class complex
{
public:
complex() { real=imag=0; }
complex(double r, double i)
{
real = r, imag = i;
}
complex operator +(const complex &c);
complex operator -(const complex &c);
complex operator *(const complex &c);
complex operator /(const complex &c);
friend void print(const complex &c);
private:
double real, imag;
};
inline complex complex::operator +(const complex &c)
{
return complex(real + c.real, imag + c.imag);
}
inline complex complex::operator -(const complex &c)
{
return complex(real - c.real, imag - c.imag);
}
inline complex complex::operator *(const complex &c)
{
return complex(real * c.real - imag * c.imag, real * c.imag + imag * c.real);
}
inline complex complex::operator /(const complex &c)
{
return complex((real * c.real + imag + c.imag) / (c.real * c.real + c.imag * c.imag),
(imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.imag));
}
void print(const complex &c)
{
if(c.imag<0)
cout<<c.real<<c.imag<<'i';
else
cout<<c.real<<'+'<<c.imag<<'i';
}
void main()
{
complex c1(2.0, 3.0), c2(4.0, -2.0), c3;
c3 = c1 + c2;
cout<<"\nc1+c2=";
print(c3);
c3 = c1 - c2;
cout<<"\nc1-c2=";
print(c3);
c3 = c1 * c2;
cout<<"\nc1*c2=";
print(c3);
c3 = c1 / c2;
cout<<"\nc1/c2=";
print(c3);
c3 = (c1+c2) * (c1-c2) * c2/c1;
cout<<"\n(c1+c2)*(c1-c2)*c2/c1=";
print(c3);
cout<<endl;
}
该程序的运行结果为:
c1+c2=6+1i
c1-c2=-2+5i
c1*c2=14+8i
c1/c2=0.45+0.8i
(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i
这是书上的一个例子,好长的啊!看着有点头晕
谁能不能用短一点的例子让我明白什么是运算符重载
还有上面的complex operator +(const complex &c);
complex operator -(const complex &c);
complex operator *(const complex &c);
complex operator /(const complex &c);
是什么意思?能解释一下上面程序在加分
complex operator -(const complex &c);
括号里的参数是什么意思 展开
6个回答
展开全部
运算符重载的目的:要使程序员自己定义的类所实例的对象,能像int,char等基础类型进行加减乘除、赋值、输入输出等运算。原则:用成员函数重载一元及与赋值有关的运算符,其中“=、()、[]、->、->*”必须用成员函数重载;用全局函数重载与赋值无关且不是必须用成员函数重载的二元运算符。
例如:
class Fraction
{
friend istream& operator>>(istream&,Fraction&);//全局函数重载>>
friend ostream& operator<<(ostream&,const Fraction&);//全局函数重载<<
friend Fraction operator!(const Fraction&);//全局函数重载一元运算符
//全局函数重载二元运算符
friend Fraction operator+(const Fraction&,const Fraction&);
friend Fraction& operator++(Fraction&);//全局函数重载前缀++运算符
friend Fraction operator++(Fraction&,int);//全局函数重载后缀++运算符
public:
Fraction(int=0,int=1);//默认构造函数
Fraction(double);//根据double构造Fraction
void set(int,int);
Fraction operator-()const;//成员函数重载一元运算符
Fraction operator-(const Fraction&)const;//成员函数重载二元运算符
operator double()const;//类型转换
Fraction& operator--();//成员函数重载前缀--算符
Fraction operator--(int);//成员函数重载后缀--算符
private:
int molecular;//分子
int denominator;//分母
static int gcd(int,int);//求两个整数的最大公约数
};
//成员函数重载一元运算符
Fraction Fraction::operator-()const
{
return Fraction(-molecular,denominator);
}
//成员函数重载二元运算符
Fraction Fraction::operator-(const Fraction& other)const
{
int m=other.denominator*molecular-denominator*other.molecular;
int d=denominator*other.denominator;
return Fraction(m,d);
}
//全局函数重载>>
istream& operator>>(istream& in,Fraction& fraction)
{
int m=0;
int d=1;
in>>m;
in.ignore();
in>>d;
fraction.set(m,d);
return in;
}
//全局函数重载<<
ostream& operator<<(ostream& out,const Fraction& fraction)
{
if(double(fraction)<0)
out<<"-";
out<<fabs(fraction.molecular);
if(fraction.molecular!=0&&fraction.denominator!=1)
out<<"/"<<fabs(fraction.denominator);
return out;
}
你的程序例子不太标准,不易于理解。推荐《C++程序设计实例教程》刘振宇 东软电子出版社 讲得很清晰透彻,非常适于初学者。学习C++,基础很重要!
如果有需要的话,请把邮箱留给我,我有电子书。
例如:
class Fraction
{
friend istream& operator>>(istream&,Fraction&);//全局函数重载>>
friend ostream& operator<<(ostream&,const Fraction&);//全局函数重载<<
friend Fraction operator!(const Fraction&);//全局函数重载一元运算符
//全局函数重载二元运算符
friend Fraction operator+(const Fraction&,const Fraction&);
friend Fraction& operator++(Fraction&);//全局函数重载前缀++运算符
friend Fraction operator++(Fraction&,int);//全局函数重载后缀++运算符
public:
Fraction(int=0,int=1);//默认构造函数
Fraction(double);//根据double构造Fraction
void set(int,int);
Fraction operator-()const;//成员函数重载一元运算符
Fraction operator-(const Fraction&)const;//成员函数重载二元运算符
operator double()const;//类型转换
Fraction& operator--();//成员函数重载前缀--算符
Fraction operator--(int);//成员函数重载后缀--算符
private:
int molecular;//分子
int denominator;//分母
static int gcd(int,int);//求两个整数的最大公约数
};
//成员函数重载一元运算符
Fraction Fraction::operator-()const
{
return Fraction(-molecular,denominator);
}
//成员函数重载二元运算符
Fraction Fraction::operator-(const Fraction& other)const
{
int m=other.denominator*molecular-denominator*other.molecular;
int d=denominator*other.denominator;
return Fraction(m,d);
}
//全局函数重载>>
istream& operator>>(istream& in,Fraction& fraction)
{
int m=0;
int d=1;
in>>m;
in.ignore();
in>>d;
fraction.set(m,d);
return in;
}
//全局函数重载<<
ostream& operator<<(ostream& out,const Fraction& fraction)
{
if(double(fraction)<0)
out<<"-";
out<<fabs(fraction.molecular);
if(fraction.molecular!=0&&fraction.denominator!=1)
out<<"/"<<fabs(fraction.denominator);
return out;
}
你的程序例子不太标准,不易于理解。推荐《C++程序设计实例教程》刘振宇 东软电子出版社 讲得很清晰透彻,非常适于初学者。学习C++,基础很重要!
如果有需要的话,请把邮箱留给我,我有电子书。
展开全部
运算符重载啊 怎么说呢!!你知道那个c++编译器它是个机器(废话) 我们想在编译器上表示两个不同的事物的相加;比如:上面的例子 实数与虚数 能相加吗? 能,但我们只能用a+bi的形式来相加;实部加实部,虚部加虚部 。。好麻烦哦。所以c++给出的了这个运算符重载,让两个数相加减更灵活。
举个例子: 比如有个苹果树AppleTree类 它有两个私有的成员kk(苹果数目)和苹果平均重sum
class Apple{
private:
int kk;
double sum;
public:
Apple(){kk = 0 ;sum = 0.0 ;}
Apple(int b = 0,double c = 0.0):kk(b),sum(c){}
~Apple(){}
}
现在我们想知道这里的2棵树的总的苹果数目 和平均重
怎么做呢? 是用a1.kk 再加上 a2.kk 吗 可以 。完全可以。
但是程序员了时间不够,要回家陪老婆 所以他换了个简单的方法
就是运算符重载 ,直接用对象相加 就搞定了
在类中 声明了一个Apple operator +( Apple &c1,Apple &c2);
再在类外 定义
inline Apple Apple::operator + (Apple &c1,Apple &c2)
{ Apple k; //一个新的对象
k.kk = c1.kk + c2.kk ;
k.sum = (c1.sum+c2.sum)/2;
return k;
}
void main()
{
AppleTree a1(200,2.3),a2(300,3.4);//定义的两个苹果树对象
AppleTree a4;//空的
a4 = a1 + a2 ;//这里就是运算符重载的精神所在了
// 当运行+ 号时 系统自动调用运算符重载函数完成对象相加
}
complex operator -(const complex &c);
c是一个const 类对象 ;就是说 这个- 号 所适应的对象了 比如
complex operator +(const complex &k); //z这里k就是对一个complex 类对象
完了;如果再不明白可以给我邮箱发信kuai2361425@163.com
举个例子: 比如有个苹果树AppleTree类 它有两个私有的成员kk(苹果数目)和苹果平均重sum
class Apple{
private:
int kk;
double sum;
public:
Apple(){kk = 0 ;sum = 0.0 ;}
Apple(int b = 0,double c = 0.0):kk(b),sum(c){}
~Apple(){}
}
现在我们想知道这里的2棵树的总的苹果数目 和平均重
怎么做呢? 是用a1.kk 再加上 a2.kk 吗 可以 。完全可以。
但是程序员了时间不够,要回家陪老婆 所以他换了个简单的方法
就是运算符重载 ,直接用对象相加 就搞定了
在类中 声明了一个Apple operator +( Apple &c1,Apple &c2);
再在类外 定义
inline Apple Apple::operator + (Apple &c1,Apple &c2)
{ Apple k; //一个新的对象
k.kk = c1.kk + c2.kk ;
k.sum = (c1.sum+c2.sum)/2;
return k;
}
void main()
{
AppleTree a1(200,2.3),a2(300,3.4);//定义的两个苹果树对象
AppleTree a4;//空的
a4 = a1 + a2 ;//这里就是运算符重载的精神所在了
// 当运行+ 号时 系统自动调用运算符重载函数完成对象相加
}
complex operator -(const complex &c);
c是一个const 类对象 ;就是说 这个- 号 所适应的对象了 比如
complex operator +(const complex &k); //z这里k就是对一个complex 类对象
完了;如果再不明白可以给我邮箱发信kuai2361425@163.com
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
运算符重载的目的:要使程序员自己定义的类所实例的对象,能像int,char等基础类型进行加减乘除、赋值、输入输出等运算。原则:用成员函数重载一元及与赋值有关的运算符,其中“=、()、[]、->、->*”必须用成员函数重载;用全局函数重载与赋值无关且不是必须用成员函数重载的二元运算符。
例如:
class Fraction
{
friend istream& operator>>(istream&,Fraction&);//全局函数重载>>
friend ostream& operator<<(ostream&,const Fraction&);//全局函数重载<<
friend Fraction operator!(const Fraction&);//全局函数重载一元运算符
//全局函数重载二元运算符
friend Fraction operator+(const Fraction&,const Fraction&);
friend Fraction& operator++(Fraction&);//全局函数重载前缀++运算符
friend Fraction operator++(Fraction&,int);//全局函数重载后缀++运算符
public:
Fraction(int=0,int=1);//默认构造函数
Fraction(double);//根据double构造Fraction
void set(int,int);
Fraction operator-()const;//成员函数重载一元运算符
Fraction operator-(const Fraction&)const;//成员函数重载二元运算符
operator double()const;//类型转换
Fraction& operator--();//成员函数重载前缀--算符
Fraction operator--(int);//成员函数重载后缀--算符
private:
int molecular;//分子
int denominator;//分母
static int gcd(int,int);//求两个整数的最大公约数
};
//成员函数重载一元运算符
Fraction Fraction::operator-()const
{
return Fraction(-molecular,denominator);
}
//成员函数重载二元运算符
Fraction Fraction::operator-(const Fraction& other)const
{
int m=other.denominator*molecular-denominator*other.molecular;
int d=denominator*other.denominator;
return Fraction(m,d);
}
//全局函数重载>>
istream& operator>>(istream& in,Fraction& fraction)
{
int m=0;
int d=1;
in>>m;
in.ignore();
in>>d;
fraction.set(m,d);
return in;
}
//全局函数重载<<
ostream& operator<<(ostream& out,const Fraction& fraction)
{
if(double(fraction)<0)
out<<"-";
out<<fabs(fraction.molecular);
if(fraction.molecular!=0&&fraction.denominator!=1)
out<<"/"<<fabs(fraction.denominator);
return out;
}
你的程序例子不太标准,不易于理解。推荐《C++程序设计实例教程》刘振宇 东软电子出版社 讲得很清晰透彻,非常适于初学者。学习C++,基础很重要!
例如:
class Fraction
{
friend istream& operator>>(istream&,Fraction&);//全局函数重载>>
friend ostream& operator<<(ostream&,const Fraction&);//全局函数重载<<
friend Fraction operator!(const Fraction&);//全局函数重载一元运算符
//全局函数重载二元运算符
friend Fraction operator+(const Fraction&,const Fraction&);
friend Fraction& operator++(Fraction&);//全局函数重载前缀++运算符
friend Fraction operator++(Fraction&,int);//全局函数重载后缀++运算符
public:
Fraction(int=0,int=1);//默认构造函数
Fraction(double);//根据double构造Fraction
void set(int,int);
Fraction operator-()const;//成员函数重载一元运算符
Fraction operator-(const Fraction&)const;//成员函数重载二元运算符
operator double()const;//类型转换
Fraction& operator--();//成员函数重载前缀--算符
Fraction operator--(int);//成员函数重载后缀--算符
private:
int molecular;//分子
int denominator;//分母
static int gcd(int,int);//求两个整数的最大公约数
};
//成员函数重载一元运算符
Fraction Fraction::operator-()const
{
return Fraction(-molecular,denominator);
}
//成员函数重载二元运算符
Fraction Fraction::operator-(const Fraction& other)const
{
int m=other.denominator*molecular-denominator*other.molecular;
int d=denominator*other.denominator;
return Fraction(m,d);
}
//全局函数重载>>
istream& operator>>(istream& in,Fraction& fraction)
{
int m=0;
int d=1;
in>>m;
in.ignore();
in>>d;
fraction.set(m,d);
return in;
}
//全局函数重载<<
ostream& operator<<(ostream& out,const Fraction& fraction)
{
if(double(fraction)<0)
out<<"-";
out<<fabs(fraction.molecular);
if(fraction.molecular!=0&&fraction.denominator!=1)
out<<"/"<<fabs(fraction.denominator);
return out;
}
你的程序例子不太标准,不易于理解。推荐《C++程序设计实例教程》刘振宇 东软电子出版社 讲得很清晰透彻,非常适于初学者。学习C++,基础很重要!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单的说,就是把运算赋予更强大的功能,让一些非数据类型能够直接用运算符相加,相减,等功能。只是具体要运算的内容由自己设计而已!
比如:“+”能够预算整数类型,现在我们把它扩展了功能,让它能运算字符串的相加的功能。
即:string a=“abc”,b=“ab”, c;
c=a+b;
那么c=“abcab”
如果没有重载,是没有这样的功能的!
ps:这些是重载类型的函数声明而已,和一般函数没有什么区别,只是格式上的要求不同。
比如:“+”能够预算整数类型,现在我们把它扩展了功能,让它能运算字符串的相加的功能。
即:string a=“abc”,b=“ab”, c;
c=a+b;
那么c=“abcab”
如果没有重载,是没有这样的功能的!
ps:这些是重载类型的函数声明而已,和一般函数没有什么区别,只是格式上的要求不同。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重载是可使函数、运算符等处理不同类型数据或接受不同个数的参数的一种方法.
在重载及函数模板重载里,编译器选择函数,要经过以下三步,这个过程称为重载解析。
第一步:创建候选函数列表,其中包含有与被调函数名称相同的函数与模板函数。
第二步:使用候选函数列表创建可行函数列表。这些都是参数数目正确的函数。
第三步:确定是否有最佳可行的函数。如果有,则使用。
在重载及函数模板重载里,编译器选择函数,要经过以下三步,这个过程称为重载解析。
第一步:创建候选函数列表,其中包含有与被调函数名称相同的函数与模板函数。
第二步:使用候选函数列表创建可行函数列表。这些都是参数数目正确的函数。
第三步:确定是否有最佳可行的函数。如果有,则使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询