2017-11-28 7 views
0

&を使って関数を持つオブジェクトを返すのはなぜですか?&(C++)を使用せずに関数を使ってオブジェクトを返す

class Point 
{ 
public: 
Point(int x, int y); 
int getX() const; 
int getY() const; 
void setX(int x); 
void setY(int y); 
void print() const; 
private: 
int x, y; 
}; 


class Circle 
{ 
public: 
Circle(int x, int y, int r, int color); 
int getColor() const; 
void setColor(int color); 
bool contains(const Point &p) const; 
void print() const; 
private: 
const Point center; 
int radius, color; 
}; 

class Collection 
{ 
public: 
Collection(int radius, int width, int height, int color); 
~Collection(); 
Circle& getCircleAt(const Point &p); 
void print() const; 
private: 
int count; 
Circle **circles; 
}; 


Circle& Collection::getCircleAt(const Point &p) 
{ 
    for (int i = 0; i < count; i++) 
     if (circles[i]->contains(p)) 
      return *(circles)[i]; 
} 

機能は、上記の円をreturnes: はたとえば、以下のクラスを見て、機能を持っていることができます。 関数getCircletでは、記号&はなぜ必要ですか?なぜ私はそれを省略できないのですか?

+0

シンボル '&'は、多くの異なるプログラミング言語で多くの異なることを意味します。 [良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間を割いて、[最小限の、完全で検証可能な例](http: //stackoverflow.com/help/mcve)。 –

+0

あなたはまだ疑問が非常に不明です。 "タイプクラス"はどういう意味ですか?あなたは型クラスを返すことによって何を意味しますか? '&'シンボルがC++で意味することが分かっていますか?あなたの問題の文脈ではどういう意味ですか?それはビット単位のAND演算子ですか?何かへの言及?アドレス演算子? –

+0

私は自分の投稿を編集しました。ごめんなさい。 –

答えて

1
あなたの関数で

Circle& Collection::getCircleAt(const Point &p) 

戻り値の型Circle&はタイプCircleのオブジェクト上への参照が返されることを意味します。あなたの関数を宣言した場合、同じボディを持つ

Circle Collection::getCircleAt(const Point &p) 

は、コピーコンストラクタが利用可能であれば、オブジェクトのコピーが返されます。つまり、返されたオブジェクトを変更すると、Collectionに含まれるオブジェクトが変更され、2番目の場合はコピーのみが変更されます。

参照番号はNULLにはなりませんので、Circleに含まれていないPointで特定の関数が呼び出されると問題が発生します。何も返すことは、今のように、選択肢ではありません。

関連する問題