演算子の再ロード(二)

7267 ワード

++演算子のリロード
前++演算子のリロード
  • メンバー関数の再ロード、プロトタイプ:関数タイプ&operator+();
  • 友元関数の方式はリロードして、原型は:friend関数タイプ&operator+(クラスタイプ&);

  • 後置++演算子のリロード
  • メンバー関数の再ロード、プロトタイプ:関数タイプoperator+(intパラメータ);
  • 友元関数の再ロード、プロトタイプ:friend関数タイプoperator+(クラスタイプ&,intパラメータ);
  • //Integer.h 
    #ifndef _INTEGER_H_
    #define _INTEGER_H_
    class Integer
    {
    public:
        Integer(int n);
        ~Integer();
        void Display() const;
        Integer& operator++();     //       
        Integer operator++(int n); //       
        //friend Integer& operator++(Integer& i); //       ,    
        //friend Integer operator++(Integer& i,int n); //       ,    
    private:
        int n_;
    };
    
    #endif // _INTEGER_H_
    
    //Integer.cpp 
    #include "Integer.h"
    #include<iostream>
    using namespace std;
    Integer::Integer(int n):n_(n)
    {
    }
    Integer::~Integer(void)
    {
    }
    void Integer::Display() const
    {
        cout << n_ <<endl;
    }
    Integer& Integer::operator++()
    {
        ++n_;
        return *this;
    }
    Integer Integer::operator++(int n)
    {
        Integer tmp(n_);
        tmp.n_ = n_;
        ++n_;
        return tmp;
    }
    //!<             
    //Integer& operator++(Integer& i)
    //{
    // ++i.n_;
    // return i;
    //}
    //Integer operator++(Integer& i,int n)
    //{
    // Integer tmp(i.n_);
    // ++i.n_;
    // return tmp;
    //}

    代入演算子のリロード
    構造関数と解析関数における付与値と初期化の違いを参照
    !演算子のリロード
    関数タイプoperator!() const
    ストリーム演算子のリロード
  • C++のI/Oストリームライブラリの重要な特性の一つは、新しいデータ型の出力と入力をサポートできることである.
  • ユーザーは、挿入記号(<)と抽出記号(>>)をリロードすることで、新しいデータ型をサポートできます.
  • ストリーム演算子のリロードは、友元関数のみを使用してリロード
  • できます.
    frinend istream&operator>(istream&、クラスタイプ&)
    frinend ostream&operator<(ostream&,constクラスタイプ&)
    #include<iostream>
    
    using namespace std;
    class MyString
    {
    public:
        MyString(const char* str="");
        friend ostream& operator<<(ostream& os,const MyString& str);
        friend istream& operator>>(istream& is,MyString& str);
        ~MyString();
    private:
        char* str_;
    };
    
    
    ostream& operator<<(ostream& os,const MyString& str)
    {
        os<<str.str_;
        return os;
    }
    istream& operator>>(istream& is,MyString& str)
    {
        char tmp[1024];
        cin>>tmp;
        str = tmp;
        return is;
    }

    タイプ変換演算子のリロード
  • はメンバー関数でなければなりません.友元関数
  • ではありません.
  • は戻りタイプを指定できません(実際には指定されています)
  • パラメータなし(オペランドは何ですか?)戻りタイプを指定できません(実は指定されています)
  • 関数プロトタイプ:operatorタイプ名()
    class Integer
    {
    public:
        Integer(int n);
        ~Integer();
        operator int(); //      ,         int;     ,          
    private:
        int n_;
    };
    Integer::operator int()
    {
        return n_;
    }
    int main(void)
    {
        Integer a(100);
        int x = a;                  //
        int y = static_cast<int>(a);//               
        return 0;
    }
    

    ->演算子
    operator new、operator delete
    newの3つの文法:
  • operator new
  • new operator
  • placement new
  • int main(void)
    {
        Test* p1 = new Test(100); //new operator = operator +        
        char chunk[10];
    
        Test* p2 = new (chunk) Test(200); // chunk        
                                          //placement new
    }

    詳細:
  • void* operator new(size_t size)
  • void operator delete(void* p)
  • void operator delete(void* p, size_t size)
  • void* operator new(size_t size, const char* file, long line)
  • void operator delete(void* p, const char* file, long line)
  • void* operator new[](size_t size)
  • void operator delete[](void* p)
  • void operator delete[](void* p, size_t size)