2016-12-16 11 views
-2

はのは、私は以下のクラスを持っているとしましょう:私は[]だけTEMP2のためではなく、一時1 aswellのための演算子をオーバーロードする必要がない理由C++演算子のオーバーロード[]

class temp1 { 
private: 
    int A; 
    double B; 
}; 

class temp2 { 
private: 
    int A[20]; 
    double B; 
}; 

void main() { 
    temp1 a[100]; 
    temp2 b; 
} 

は今の質問はありますか? inorderは、クラス2のtempableで10のインデックスに到達することを知っています。実際に演算子[]をオーバーロードする必要がありますが、メインのクラスは配列 (temp1 a [100])なので、コンパイラは知っています私が[]演算子を使用して過負荷をかけずに使用するときはどういう意味でしょうか。

+0

実際にコードを実行しようとしましたか?エラーが出ていますか? – AndyG

+0

"*クラス2のtempable 2の10のインデックスを取得するためにinorderが実際に演算子[] *をオーバーロードする必要があることを知っています。どうして? –

+0

どのようにエラーに関連していますか?私は何かエラーを得ることはありません..しかし、それは私の質問ではありません 私はb [5]をしようとすると私はエラーを取得する場合でも私は[i]のインデックスを取得することを目指していた2しかし、オペレータが過負荷になることはありません。 何か他に質問していますが、なぜtemp1に演算子のオーバーロードが必要なのですか? (私はここにいくつかのことを理解しようとイムそれが動作するかどうか気にしたりしませいけない) –

答えて

0

私が正しくあなたの質問を理解している場合、次のような場合には、コンパイラはあなたが宣言された配列の長さを指定していることを前提としています:

int A[20];

と、次の場合に、それは意志あなたの例では

A[2] = 3; // after variable declaration.

+0

私は自分のメインで作業を続け、A [15]のようないくつかのことをやろうと思っていますが、私は演算子をオーバーロードする必要がありません。なぜコンパイラは私が15番目のインデックス配列 –

+2

@Lianthe:実際には '[]'はCスタイルの配列のインデックス演算子であり、型自体ではないからです。これは、プリミティブだけでなく、あらゆるタイプのCスタイルの配列に対しても機能します。 – AndyG

+0

@AndyGあなたは正しく、私は全く別のものを考えていました:AndyGのように、 – Gimballock

1

、ローカル変数:あなたは括弧内の指定したインデックスに到達するために「[]」添字演算子を使用していることを前提としていはの配列です。タイプ配列がTの値は、タイプがTの値のようには動作しません。タイプがT*のポインターと同じように動作します。


ポインタ(または配列)は、指し示すタイプであるかのように直接使用することはできません。

このFooタイプ考えてみましょう:私は

Foo* f = new Foo[2]; 

を持っている場合、私はf.doStuff()を言うことができない

class Foo { 
    public: doStuff() { 
     std::cout << "hello" << std::endl; 
    } 
}; 

を。その場合、fFooFoo*ではなく)である必要があります。

fからFooを得るために、私は*fとしてデリファレンスにそれを持っています。例えば

(*f).doStuff(); // -> hello 

ためこれは明らかにC++の特別としてポインタ型を扱うことを示している - それらは自動的に特別な操作がそのうちの一つは*で、定義されています。

私はfを2つの要素の(動的に割り当てられた)配列と定義しました。

*f,またはf[0]を使用して参照することができます。

第2の要素はf[1]によって*(f+1)またはによって参照することができます。

[]は、C++のポインタ(および配列)型の別の特殊な演算子です。意味はあなたの例では、多かれ少なかれ

T& operator[](T* pointer, int index) { 
    return *(pointer + index); 
} 

で、ローカル変数bはタイプtemp2です。 temp2はポインタではないため、コンパイラにはb[10]の定義がありません。それをやりたければ、タイプtemp2はその定義を明示的に提供する必要があります。

関連する問題