深圳C++培训
达内深圳龙华中心

139-2227-5185

热门课程

深圳C++培训:c++运算符重载总结

  • 时间:2017-10-19
  • 发布:深圳C++培训
  • 来源:达内新闻

深圳C++培训:c++运算符重载总结

c++的一大特征便是重载(overload),经由过程重载能够把功效相似的几个函数合为一个,使得法式加倍简练、高效。在c++中不止函数能够重载,运算符也能够重载。因为一样平常数据范例间的运算符没有重载的需要,以是运算符重载主如果面向工具之间的。

1.一样平常运算符重载

在停止工具之间的运算时,法式会挪用与运算符相对应的函数停止处置,以是运算符重载有两种办法:成员函数和友元函数。成员函数的情势比拟简略,便是在类外面界说了一个与操纵符相干的函数。友元函数因为没有this指针,以是形参会多一个。

class A

{

public:

A(int d):data(d){}

A operator+(A&);//成员函数

A operator-(A&);

A operator*(A&);

A operator/(A&);

A operator%(A&);

friend A operator+(A&,A&);//友元函数

friend A operator-(A&,A&);

friend A operator*(A&,A&);

friend A operator/(A&,A&);

friend A operator%(A&,A&);

private:

int data;

};

//成员函数的情势

A A::operator+(A &a)

{

return A(data+a.data);

}

A A::operator-(A &a)

{

return A(data-a.data);

}

A A::operator*(A &a)

{

return A(data*a.data);

}

A A::operator/(A &a)

{

return A(data/a.data);

}

A A::operator%(A &a)

{

return A(data%a.data);

}

//友元函数的情势

A operator+(A &a1,A &a2)

{

return A(a1.data+a2.data);

}

A operator-(A &a1,A &a2)

{

return A(a1.data-a2.data);

}

A operator*(A &a1,A &a2)

{

return A(a1.data*a2.data);

}

A operator/(A &a1,A &a2)

{

return A(a1.data/a2.data);

}

A operator%(A &a1,A &a2)

{

return A(a1.data%a2.data);

}

//而后咱们就能够对类的工具停止+、-、*、/了。

void main(void)

{

A a1(1),a2(2),a3(3);

a1=a2+a3;

//或许

a1=a2.operator+(a3);

}

留意:在停止a2+a3的时刻会失足,因为咱们在上面临+界说了两种办法,去掉一种便可。

2.干系运算符重载

因为函数体比拟简略,前面我就只给出成员函数情势的函数声清楚明了,干系运算符有==,!=,<,>,<=,>=。

bool operator == (const A& );

bool operator != (const A& );

bool operator < (const A& );

bool operator <= (const A& );

bool operator > (const A& );

bool operator >= (const A& );

3.逻辑运算符重载

bool operator || (const A& );

bool operator && (const A& );

bool operator ! ();

4.单目运算符重载

这里的+、-是正负的意思,放在工具前面。

A& operator + ();

A& operator - ();

A* operator & ();

A& operator * ();

5.自增减运算符重载

++和–依据地位的不同有四种环境,都能够重载。

A& operator ++ ();//前置++

A operator ++ (int);//后置++

A& operator --();//前置--

A operator -- (int);//后置--

6.位运算符重载

按位操纵。

A operator | (const A& );

A operator & (const A& );

A operator ^ (const A& );

A operator << (int i);

A operator >> (int i);

A operator ~ ();

7.赋值运算符重载

没有=哦。

A& operator += (const A& );

A& operator -= (const A& );

A& operator *= (const A& );

A& operator /= (const A& );

A& operator %= (const A& );

A& operator &= (const A& );

A& operator |= (const A& );

A& operator ^= (const A& );

A& operator <<= (int i);

A& operator >>= (int i);

8.内存运算符重载

void *operator new(size_t size);

void *operator new(size_t size, int i);

void *operator new[](size_t size);

void operator delete(void*p);

void operator delete(void*p, int i, int j);

void operator delete [](void* p);

9.特别运算符重载

上面的运算符重载都有两种办法,而下面的运算符只能用一种,特别吧。 这些运算符的重载只能是成员函数。

A& operator = (const A& );

char operator [] (int i);//前往值不能作为左值

const char* operator () ();

T operator -> ();

//范例转换符

operator char* () const;

operator int ();

operator const char () const;

operator short int () const;

operator long long () const;

//另有许多就不写了

而这些只能以友元函数的情势重载

friend inline ostream &operator << (ostream&, A&);//输入流

friend inline istream &operator >> (istream&, A&);//输入流

10.总结

两种重载办法的比拟:

一样平常环境下,单目运算符最佳重载为类的成员函数;双目运算符则最佳重载为类的友元函数。

如下一些双目运算符不能重载为类的友元函数:=、()、[]、->。

范例转换函数只能界说为一个类的成员函数而不能界说为类的友元函数。 C++供给4个范例转换函数:reinterpret_cast(在编译时代完成转换)、const_cast(在编译时代完成转换)、stactic_cast(在编译时代完成转换)、dynamic_cast(在运转时代完成转换,并能够前往转换胜利与否的标记)。

若一个运算符的操纵需要改动工具的状况,抉择重载为成员函数较好。

若运算符所需的操纵数(尤其是第一个操纵数)希望有隐式范例转换,则只能选用友元函数。

当运算符函数是一个成员函数时,最右边的操纵数(或许只要最右边的操纵数)必需是运算符类的一个类工具(或许是对该类工具的援用)。假如右边的操纵数必需是一个不同类的工具,或许是一个外部 范例的工具,该运算符函数必需作为一个友元函数来完成。

当需要重载运算符具备可交换性时,抉择重载为友元函数。

留意事项:

除类属干系运算符”.“、成员指针运算符”.*“、作用域运算符”::“、sizeof运算符和三目运算符”?:“之外,C++中的一切运算符都能够重载。

重载运算符限定在C++语言中已有的运算符范围内的容许重载的运算符当中,不能创立新的运算符。

运算符重载实质上是函数重载,是以编译法式对运算符重载的抉择,遵守函数重载的抉择准则。

重载之后的运算符不能改变运算符的优先级和联合性,也不能改变运算符操纵数的个数及语法结构。

运算符重载不能改变该运算符用于外部范例工具的寄义。它只能和用户自界说范例的工具一路应用,或许用于用户自界说范例的工具和外部范例的工具混杂应历时。

运算符重载是针对新范例数据的现实需要对原有运算符停止的恰当的改革,重载的功效该当与原有功效相相似,防止没有目的地应用重载运算符。

想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入达内,一起进入IT行业,跟着达内的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳C++培训

上一篇:2017年如何系统的学习C++编程语言 - 深圳C++培训
下一篇:深圳C++培训:一起说说 C++ Traits Classes

怎么去读懂C/C++中复杂声明?

为什么要在C ++中进行声明

怎么把C语言的数组变成java字节码

深圳C++培训:什么是析构函数?

选择城市和中心
贵州省

广西省

海南省