zoukankan      html  css  js  c++  java
  • Overloaded operators

    Overloaded operators

    Restrictions

    • Only existing operators can be overloaded.

    • Operators must be overloaded on a class or enumeration type

    • Overloaded operators must

      • Preserve number of operands
      • Preserve precedence
    • Just a function with an operator name!

      • Use the operator keyword as a prefix to name operator *(...)

    Member Functions

    • Implicit first argument
    • Developer must have access to class definition
    • Members have full access to all data in class
    • No type conversion performed on receiver(The number before the operator is receiver)

    The prototypes of operators

    • +-*/%^&|~
      const T operatorX(const T& l, const T& r) const;
    • ! && || < <= == >= >
      bool operatorX(const T& l, const T& r) const;
    • []
      T& T::operator[](int index)
      .........

    operator ++ and --

    • postfix forms take an int argument -- compiler will pass in 0 as that int
    class Integer{
    public:
    	const Integer& operator++(); //prefix++
    	const Integer operator++(int); //postfix++
    	const Integer& operator--(); //prefix--
    	const Integer operator--(int); //postfix--
    };
    
    const Integer& Integer::operator++(){
        *this += 1; 
        return *this;
    }
    
    //int argument not used so leave unnamed so won't get compiler warnings
    //int参数未使用,因此保留未命名,因此不会收到编译器警告
    const Integer Integer::operator++(int){
        Integer old(*this);
        ++(*this);
        return old;
    }
    

    Relational operators

    • implement != in terms of ==
    • implement >, >=, <= in terms of <
    class Integer{
    public:
    	
    	bool Integer::operator==( const Integer& rhs ) const;
    	bool Integer::operator!=( const Integer& rhs ) const;
    	bool Integer::operator< ( const Integer& rhs ) const;
    	bool Integer::operator> ( const Integer& rhs ) const;
    	bool Integer::operator>=( const Integer& rhs ) const;
    	bool Integer::operator<=( const Integer& rhs ) const;
    };
    
    • Function prototype:
    bool Integer::operator==( const Integer& rhs ) const{
    	return i == rhs.i;
    }
    
    //implement lhs != rhs in terms of !(lhs == rhs)
    bool Integer::operator!=( const Integer& rhs ) const{
        return !(*this == rhs);
    }
    
    bool Integer::operator< ( const Integer& rhs ) const{
        return i < rhs.i;
    }
    
    //implement lhs > rhs in terms of lhs < rhs
    bool Integer::operator> ( const Integer& rhs ) const{
        return rhs < *this;
    }
    
    //implement lsh <= rhs in terms of !(lhs < rhs)
    bool Integer::operator<=( const Integer& rhs ) const{
        return !(rhs < *this);
    }
    
    //implement lsh >= rhs in terms of !(lhs < rhs)
    bool Integer::operator>=( const Integer& rhs ) const{
        return !(*this < rhs);
    }
    

    从函数原型可知,6个关系运算符都由小于和等于演变而成,若要修改较为方便。

    operator []

    • Must be a member function
    • Single argument
    • Implies that the object it is being called for acts like an array, so it should return a reference

    operator =

    T& T::operator=(const T& rhs){
        //check for self assignment
        if(this != &rhs){
            //perform assignment
        }
        return *this;
    }
    
    • For classes with dynamically allocated memory declare an assignment operator (and a copy constructor)
    • To prevent assignment, explicitly declare operator= as private

    Value classes

    • new key word : explicit
    class One{
    public:
        One(){}
    };
    
    class Two{
    public:
        //Two(const One&) {}
        explicit Two(const One&) {}
    };
    
    void f(Two) {}
    
    int main()
    {
        One one;
        //f(one); No auto conversion allowed
        f(Two(one)); //OK -- user performs conversion
    }
    

    examples:

    实现自己的MyString类(源码)https://github.com/Mered1th-Wang/Cpp-Learning/tree/master/20190520/MyString

    Reference:

    面向对象程序设计-C++

  • 相关阅读:
    [UE4]蓝图中清空变量值或设置为null
    [UE4]运行时脱离视角,进入自由视角
    [UE4]扔枪
    [UE4]反射
    为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容
    [UE4]根据名字调用函数(蓝图)
    [UE4]移除UI(User Widget)并销毁
    [UE4]Return Node节点好用法
    [UE4]关于分支Sequence和条件分支的组合用法
    [UE4]隐藏对象Set Visibility
  • 原文地址:https://www.cnblogs.com/Mered1th/p/10887270.html
Copyright © 2011-2022 走看看