[CPP Moudle 02] Ad-hoc polymorphism, operators overload and orthodox canonical classes

6999 ワード

1.コピー作成者

Fixed::Fixed(const Fixed& fixed) // 선언
Fixed a;
Fixed b(a); // a를 복사해 b를 생성했다.
レプリケーション作成者は、既存の値をユーザーにコピーして渡す概念なので、値は変更できません.このためconstと発表された.
  • を定義しないと、エラー・レプリケーション・ジェネレータが生成されます.
  • 双極子放射生成子を浅い放射とする.
  • レプリケーション作成者を再定義することは、すべて深さレプリケーションであることを意味しません.
  • の深さレプリケーションを行うには、レプリケーションジェネレータ内に動的に割り当てられた新しいオブジェクトが必要です.
  • 1.1. 浅いコピー

  • オブジェクトをコピーすると、そのオブジェクトのみがコピーされ、新しいオブジェクトが作成されます.
  • 複製オブジェクトのインスタンス変数は、元のオブジェクトのインスタンス変数と同じメモリアドレスを参照する.
  • したがって、メモリアドレスの値が変更されると、ソースオブジェクトとコピーオブジェクトのインスタンス変数の値が変更されます.

    1.2. 深くコピー

  • オブジェクトがコピーされると、そのオブジェクトとインスタンス変数にコピーされます.
  • すべての
  • が新しいアドレスにコピーされるため、参照は共有されません.
  • 2.代入演算子のロード


    2.1. 過負荷とは?


    CPPでは、関数の名前が同じでパラメータが異なる場合、関数を宣言および定義できます.演算子のオーバーロードは、既存の演算子の再定義と見なすこともできます.通常、元のオブジェクト間では+などの演算子は使用できません.ただし、+を定義する機能を演算子で再ロードすると、基本データ型変数のように加算、減算、乗算などの演算を行うことができる.これにより,オブジェクトも基本資料型データのように扱うことができる.

    2.2. 演算子のオーバーロード方法

    Fixed& operator=(const Fixed& fixed);
    演算子のリロードを行うには、演算子キーと演算子を組み合わせて関数の名前を定義します.
    クラス内で演算子の再ロードが宣言された場合、クラスメンバー関数を使用して=を再ロードできます.
    Fixed::Fixed(const Fixed& fixed)
    {
    	std::cout << "Copy constructor called" << std::endl;
    	*this = fixed;
    }
    *this = fixed;は、左の*thisオブジェクトに対してoperator=関数を呼び出し、右の被演算子オブジェクトfixedをパラメータとして渡す.
  • が定義されていない場合、depart代入ジェネレータが生成されます.
  • ディポルト大学の新入生が浅い放射線を浴びた.
  • 世代生成者内で動的割り当てまたは深さレプリケーションを行う必要がある場合は、直接定義する必要があります.
  • 3. const value casting

    constとして定義された値を変更するには、const_cast<T>を使用します.const_cast<T>は、constと定義された変数の空間自体をconst一時削除の形式とするために、変数のアドレスをパラメータとして受け入れる.もちろん、逆の場合のように、const以外の空間をconstにしてもよい.static_cast<T>とは異なり、タイプ変換は不可能であることに注意してください.
    int main(void)
    {
    	const int a = 1;
    	int b;
    
    	b = static_cast<int>(a);
    	return(0);
    }
    以上の場合、constが削除されたかどうかがわかり、、aという空間自体はstatic_cast<T>の呼び出しにおいて、constの属性は変わらない.この文法はbに割り当てるために一時的にタイプを調整したにすぎない.したがって,aの値を変更しようとすると,ポインタ操作を用いても結果は同じコンパイルエラーが発生したと判断できる.
    include <string>
    #include <iostream>
    
    int main(void)
    {
    	const std::string a = "hi good";
    	(*(const_cast<std::string *>(&a)))[1] = 'o';
    	std::cout << a << std::endl;
    	return (0);
    }
    逆に、上記のconst_cast<T>から見ると、const_cast<T>が呼び出されるにつれて、aの空間はconstの属性を一時的に削除し、値を変更する.
    const castでもテキスト領域の値は変更できません.