zoukankan      html  css  js  c++  java
  • 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++中通过operatorkeyword扩展操作符

        *: 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 keyword能够获得类外訪问类的权限

        (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),少一个參数,
              *:不须要使用friendkeyword


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

               *:当无法改动作參数的类时。使用全局函数进行重载

                   如: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 keyword能够使全局函数訪问类。开发类的訪问权限

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

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







  • 相关阅读:
    <<网络是怎样连接的>>笔记第一章browser生成message
    豆知识( DNS; HTTP入门;网络协议)
    日期和时间的操作
    类型转换
    分组查询
    存储过程
    触发器
    表连接
    变量
    union以及一些扩展
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6893695.html
Copyright © 2011-2022 走看看