C ++の戻りオブジェクトと戻り参照



C Return Object Return Reference



私たちはそれを見つけましたC ++その中で、一部のメンバー関数はオブジェクトを返し、一部の関数は参照を返します。

オブジェクトを返すことと参照を返すことの主な違いは、関数プロトタイプと関数ヘッダーです。



Car run(const Car&)//オブジェクトを返す

Car&run(const Car&)//参照を返す



戻りオブジェクトには次のものが含まれます返されたオブジェクトのコピーを作成します、これは関数を呼び出すプログラムのコピーであるため、使用できます。オブジェクトを返すための時間コストこれには、コピーコンストラクタを呼び出してコピーを生成するために必要な時間と、デストラクタを呼び出してコピーを削除するために必要な時間が含まれます。参照を返すと、時間とメモリを節約できます。オブジェクトを直接返すことは、両方とも一時的なコピーを生成するという点で、値でオブジェクトを渡すことに似ています。同様に、参照を返すことは、参照によってオブジェクトを渡すことに似ており、呼び出し元の関数と呼び出された関数は同じオブジェクトを操作します。

参照を返すことが常に可能であるとは限りません。関数が関数で作成された一時オブジェクトへの参照を返すことができない場合、関数が終了すると一時オブジェクトが消えるので、この種の参照は違法であるため、この場合、呼び出し側プログラムが使用できるコピーを生成するために、オブジェクトを返す必要があります。

といった:



RMB& RMB::operator++() { yuan++ return *this } RMB RMB::operator++(int) { RMB temp(yuan) //Create object yuan++ return temp //return a copy of the object }

原則として、関数が関数で作成された一時オブジェクトを返す場合は、参照を使用しないでください、最初にオブジェクトを作成してから、変更されたオブジェクトのコピーを返す場合は、返されたオブジェクトを使用できます。上記の2番目の場合のように。

関数が参照またはポインタによって渡されたオブジェクトを返す場合、関数は参照によってオブジェクトを返す必要があります。関数を呼び出したオブジェクトまたは関数にパラメーターとして渡されたオブジェクトを参照して返す場合。上記の最初の場合のように。

C ++ノート-オブジェクトを返すか参照を返す


拡張例-有理数の4つの算術の計算

#include #include using namespace std int gongyueshu(int a,int b) /*Euclidean division method*/ { int ret if(a!=b) { int m, n m = (a>b)?a:b n = (a>b)?b:a while(n) { ret = m%n m = n n = ret } ret = m } else { ret = a } return ret } class Rational { private: int numerator int denominator public: Rational() { numerator = 0 denominator = 1 cout << 'Rational()' << endl } Rational(int numerator, int denominator) { if(denominatornumerator = numerator if(denominator!=0) this->denominator = denominator cout << 'Rational()' << endl /*throw exception*/ /*If the denominator is 0, throw an exception to be added*/ } Rational(const Rational& obj) { numerator = obj.numerator denominator = obj.denominator cout << 'Rational(const Rational& obj)' << endl } Rational& operator +(Rational& obj) { numerator = numerator*obj.denominator + denominator*obj.numerator denominator *= obj.denominator return *this } Rational& operator -(Rational& obj) { numerator = numerator*obj.denominator - denominator*obj.numerator denominator *= obj.denominator return *this } Rational operator *(Rational& obj) /*Returning the object will call the copy construction and destructor function*/ { numerator *= obj.numerator denominator *= obj.denominator return *this } Rational operator /(Rational& obj) { numerator *= obj.denominator denominator *= obj.numerator return *this } void print() { int temp = gongyueshu(abs(numerator),abs(denominator)) numerator /= temp denominator /= temp if(denominator!=1) { cout << numerator << '/' << denominator << endl } else { cout << numerator << endl } } ~Rational() { cout << '~Rational()' <> m cin >> n cout << gongyueshu(m,n) << endl */ Rational a1(-1,-8) Rational a2(7,8) a1 = a1+a2 a1.print() a1 = a1-a2 a1.print() a1 = a1*a2 a1.print() a1 = a1/a2 a1.print() return 0 }