更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

c++开发教程之自定义类型的运算

  • 发布:C++培训
  • 来源:网络
  • 时间:2019-01-15 13:19

这篇文章讲述了c++的自定义类型的运算。是小编结合C++培训课程中的知识总结出来的,希望可以帮助到同学们!

一:首先说明下成员函数和非成员函数的区分

class A

{

public:

void f1(){}; // 这个就是成员函数。

void f2(); // 这个也是成员函数声明,其实现在类的外部。

};

void A::f2(){} // 这个是成员函数的实现。

void f3(){}; // 这个就是非成员函数,它不属于A,也不属于任何一起其他的类。

*加上下面二中的运算符重载为非成员函数和成员函数

二.运算符重载函数

1.五个运算符不允许重载

(1).成员访问运算符

(2).*成员指针运算符

(3)::作用域区分运算符

(4)?:条件运算符

(5)sizeof 测数据空间大小运算符

2.在可重载的运算符中除了new和delete以外,任何运算符都可以重载为成员函数,但不得重载为静态函数。

(附):静态函数参见另一篇文章

(正式进入主题)

二.运算符重载

1.运算符重载为非成员函数和成员函数对比(重载+ - * /)

#include<iostream>

using namespace std;

class Complex

{

protected:

double real,image;

public:

Complex(double r=0,double i=0){real=r;image=i;}

friend Complex operator-(Complex c1,Complex c2);//非成员函数,用friend作用是友元函数可以用类中的任何数据

Complex operator+(Complex c1);//成员函数

void show(){cout<<real<<"+"<<image<<"i"<<endl;}

};

Complex Complex::operator+(Complex c1)//成员函数实现

{

return Complex(real+c1.real,image+c1.image);

}

Complex operator-(Complex c1,Complex c2)//非成员函数实现

{

return Complex(c1.real-c2.real,c1.image-c2.image);

}

int main()

{

Complex c3,c1(3,4),c2(1,2);

c3=c1-c2;//即c3=operator-(c1,c2),顺便说一下如果两边都是Complex类型赋值运算符不用重载

c3.show();

c3=c1+c2;//即c3=c1.operator+(c2)

c3.show();

return 0;

}

运行结果:

2+2i

4+6i

2.重载++ --

Complex operator ++();//前置加1运算符

Complex operator ++(int)//后置加1运算符函数

(举个栗子):

Complex& Complex::operator++()//顺便讲一下这里的引用是为了在return *this时少调用一次复制构造函数,以及可以出现在等号左边如:++c1=...

{

++real;

return *this;//返回值已变

}

Complex Complex::operator(int)

{

return Complex(real++,image);//返回值不变

}

3.重载 =

注意点:

赋值运算符只能作为成员函数重载(重点);

举个例子:FunType& operator = (FunType&,FunType);//错误!因为只能作为成员函数重载

要求第一操作数必须是左值,即加引用;

重载 = 一般与深拷贝浅拷贝挂钩,所以建议读者去看作者另一篇文章是c++深拷贝与浅拷贝

4.重载类型转换符,即强制类型转换

一般用法(省略了一些代码,只讲关于运算符的代码):

class

{

private:

double:real,image;

public:

operator lue();//类型转换运算符函数

};

Complex::operator lue()

{

return real;//只返回了实数

}

int main()

{

Complex a(1,2);

lue(a);

}

特殊用法:在重载=运算符时,当运算符两边数据类型不同时,会自动进行类型转换,如果右边是对象,在类中要找强制类型转换符

如 t=c[j];(wustacm平台的1457题)

在类中要加上operator double(){return radius;}

5.重载下标访问运算符 []

注意点:

返回必须引用,因为赋值运算符会出现在=左边。

代码:

class

{

private:

double *data;

public:

double& operator[](int index);//声明时注意引用

};

double& Array::operator[](int index)

{

if(...)

return data[...];

}

6.重载>>和<<运算符

class Circle

{

private:

radius;

public:

friend istream& operator>>(istream&i,Circle &m);//非成员函数

friend ostream& operator<<(ostream&o,Circle &m);

};

istream& operator>>(istream&i,Circle &m)

{

cin>>m.radius;

return i;

}

ostream& operator<<(ostream&o,Circle m)

{

cout<<m.radius;

return o;//是o不是0

}

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C++开发中类的定制
下一篇:C++开发中预处理器教程

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省