9-操作符重载

一.运算符重载---为运算符提供不同的语义

struct Complex
		{
			int a;
			int b;
		};
		Complex c1={1,2};
		Complex c2={4,5};

如果想对c1,c2直接相加c1+c2,C语言中直接的方法就是用函数实现。

     C++中用运算符重载来实现c1+c2;

    C++中运算符重载的本质:

    *: C++中通过operator关键字扩展操作符

    *: operator的本质是通过函数重载实现操作的

Complex operator+ (const Complex& c1,const Complex& c2)
	{
	<span>	</span>Complex ret={0,0};
		ret.a =c1.a+c2.a;
		ret.b =c1.b+c2.b;
		return ret;
	}

operator+ (c1,c2) <==> c1+c2

  二.C++中的友元

      *:private 声明使得类的成员不能被外界访问

      *:通过 friend 关键字可以获得类外访问类的权限

    (1)<<重载左移操作符

      

ostream operator<<(ostream& out,const Complex& c)
{
	out<<c.a<<"+"<<c.b<<"i";
	return out;
}

    (2)operator+ 的成员函数重载

Complex Complex::operator+ (const Complex& c)
{
	Complex ret;
	ret.a = a+c.a;
	ret.b = b+c.b;
	return ret;
}

三. 用成员函数重载和用全局函数重载比较

     使用成员函数重载:

     *:相比使用全局函数重载操作符(friend),少一个参数,

*:不需要使用friend关键字

     如何选择使用全局函数重载和成员函数重载操作符

           *:当无法修改作参数的类时,使用全局函数进行重载

               如:friend ostream operator<<(ostream out,const Complex& c);

           *;=,[],-> 操作符只能通过成员函数进行重载。

       (3)[] 的重载

          

int& Array::operator[](int i)
{
    return mSpace[i];
}

      (4)= 的重载

Array& Array::operator= (const Array& obj)
{
	delete[] _space;
	_length = obj._length;
	_space = new int[_length];
	for(int i=0;i<_length;++i)
		_space[i] = obj._space[i];
	return  *this;
}

(5)== 的重载

bool Array::operator==(const Array& obj)

注意:

       (1) C++编译器会为每个类提供默认的赋值操作符

       (2)默认的赋值操作符只是简单的值复制

       (3)当类中存在指针成员变量时(如字符串类)时,就需要重载赋值操作符

四.++操作符的重载

     (1)++操作符只有一个参数

     (2)++ 操作符有前缀和后缀之分

     解决方案:

            C++中通过一个占位参数来区分前缀操作符和后缀操作符的重载 

(1) obj++ 的重载    
     

Complex operator++(int ) // obj++
{  ///  int 的意义主要区分前缀和后缀
	Complex ret = *this;
	a++;
	b++;
	return ret;
}

(2)++obj 的重载

Complex operator++() // ++obj
{
	++a;
	++b;
	return *this;
}

小结:

(1) 操作符重载的本质是函数重载,扩展操作符的语义

    (2)friend 关键字可以使全局函数访问类,开发类的访问权限

    (3)=,[],-> 操作符只能通过成员函数进行重载

    (4) ++ 操作符通过一个int 参数进行区分前缀与后缀的重载

时间: 2024-10-07 11:04:46

9-操作符重载的相关文章

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我

c++ --&gt; 操作符重载

一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: #include <iostream> using namespace std; int main() { int a = 2 , b = 3; float c = 2.1f , d = 1.2f; cout<<"

Python中的操作符重载

类可以重载python的操作符 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook),python通过这 种特殊的命名来拦截操作符,以实现重载. python在计算操作符时会自动调用这样的方法,例如: 如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法.通过重载,用户定义的对 象就像内置的一样. 在类中重载操作符 1.操作符重载使得类能拦截标准的python操作. 2.类可以重载所有的python的表达式操作符. 3.类可以重载对象操作:prin

操作符重载

class Program { int count; public Program() { } public Program(int count) { this.count = count; } static void Main(string[] args) { Program p1 = new Program(16); Program p2 = new Program(16); /** 操作符调用 */ Console.WriteLine(p1 + p2); Console.WriteLine

第二十篇:类操作符重载的相关规定与具体实现示例

前言 有书这么说过,C++设计的最大目的在于允许程序员定义自己的类型,并使它们用起来跟内置类型一样容易和直观.就目前看来,要实现这一点,最核心的莫过于操作符的重载.科学的重载可以让类的使用最大程度地接近内置类型.本文将讨论类操作符重载涉及到的一些原则和具体做法. 实现类操作符重载的两种思路 1. 友元函数法: 将待重载操作符视作非成员函数( 它声明为操作数类型的友元函数 ) 应当采用这种机制重载的运算符有:IO操作符,算数操作符,关系操作符. 2. 成员函数法: 将待重载操作符视作特殊的成员函数

拷贝构造函数 和 赋值操作符重载

什么时候需要定义自己的拷贝构造函数: 当类中包含有,动态分配成员 或者 指针 的时候. 如果使用默认构造函数,则新构造出来的 新类 和 旧类 里面的指针成员 指向同一个空间, 而当其中一个类 清空掉那个空间 .另一个类的指针就会变成野指针(因为空间已经被清空) , 也就是说默认构造函数是复制值(地址也是值) ps.基本数据类型的数组可以直接使用默认复制构造函数.也就是说有涉及到 自行开辟额外空间 的数据类型 和 指针 的类就需要 什么时候调用拷贝构造函数: 1.一个对象以 值传递 的方式 传入

操作符重载方法

CLR规范要求重载操作符重载方法必须是public和static方法 C#要求操作符重载方法至少有一个参数的类型与当前定义的这个方法类型相同 为了减少运行时开销,编译器会直接针对基元类型执行运算,并直接生成操作这些类型的实例的中间代码(IL)指令,所以在Framework标准库中没有定义基元类型的操作符重载 代码示例 public sealed class Complexe { public static Complexe operator +(Complexe c1, Complexe c2)

再议Swift操作符重载

今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又臭又长.而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣. 谨 慎引入,按需使用.比如在连接两个字串的时候你就可以通过重载加法来实现.甚至于你仅在屏幕上输入一个加号,就能响应一个网络链接.播放一段音乐或者完成 你能实现的其他任何功能.然而过于复杂的功能对编码来说简直就

操作符重载.xml

pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;} .selfFuc{color:#800080;} .bool{color:#d2576f;} .condition{color:#000080;font-weight:bold;} .key{color:#000080;} .

【C/C++】操作符重载

常见问题 Q1. 下列运算符,在C++语言中不能重载的是( ). A. * B. ?: C. :: D. delete Q2. 编写类String的构造函数.析构函数和赋值函数. Q3. 复制构造函数与赋值运算符的区别是什么? Q4. 下述代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 class X 4 { 5 public: 6 X() { cout << "constructor" &l