2017-01-07 5 views
1

this質問で見つかったことによると、参照配列は不正です。私はちょっと新しいC++を指していて、ポインタとデリファレンスを使って遊んでいました。次のコードはうまく実行されているようです。逆参照ポインターを持つC++充填配列

#include <iostream> 
#include <cstdlib> 

using namespace std; 

struct A 
{ 
    int data1; 
    int data2; 

    A (void) : data1(0), data2(0) {} 

    // many more datas 
}; 

int main() 
{ 
    cout << "test start" << endl; 

    A *a = new A(); 
    A arr[100]; 

    for (int x=0; x<100; x++) arr[x] = *a; 

    cout << "test done" << endl; 
} 

ここで何が起こるのですか? arrayのすべての場所にaオブジェクトがコピーされていますか?もしそうなら、のような関数からオブジェクト参照を返すとき:これはあなたの最初の質問については

A function (void) {return A();} 
+2

「i」が定義されていないため、コンパイルエラーが発生します。 –

+0

申し訳ありませんが、私は質問をする際に 'i'を変更しました。両方とも' a'固定になっています – shishkebab

+3

'arr [x] = * a;'は、クラスの暗黙的に宣言されたコピー代入演算子を呼び出して各メンバーをコピーします。 – Unimportant

答えて

0

を?:として

A &function (void) { return &A(); } 

は、それはすべてのデータをコピーするためのプログラムがarr[x] = *a;、同じ薄くなり引き起こしますオブジェクト内の指定された配列要素に格納されます。

2番目の質問では、A &function (void) { return &A(); }は関数のアドレスを返そうとしているようですが、形式が正しくありません。詳細については、「関数へのポインタ」を参照してください。ただし、これを行うことができます:

A test; 

A &function(void) 
{ 
    return test; 
} 

A &ref = function(); 

この方法では、あなたが言及して使用し、あなたの関数は、そのオブジェクトにアドレスを返すことができ、あなたのプログラム内の実際のオブジェクトを持っています。あなたがその特定の機能で何をしようとしているかのようです。

編集:誤った回答部分を削除しました。 A function(void) { return A(); }です。オブジェクトを作成し、作成したオブジェクトを返します。

Edit2:return &test;からreturn test;A &function()に変更しました。

+1

"関数のアドレスを返そうとしているようです"。いいえ、彼はAの一時インスタンスへの参照を返そうとしています。 '()'は単純にデフォルトのコンストラクタへの明示的な呼び出しです。これは悪い考えであり、コンパイルされませんが、彼の意図は次のコード行から推測されます: '関数(void){return A();}'は完全に正しいBTWです。 – Unimportant

+0

私は彼が何をしようとしているのか知っています。元の 'A関数(void)'関数に関する情報をありがとう。 –

+2

それでは、壊れたコードはどうですか?あなたの関数は、 'A&'参照を返さなければならない関数で 'test'のアドレスを返します。コンパイルされません。 – Unimportant