2016-03-22 11 views
2

Javaの背景から来ていますが、次のコードは私を混乱させています。ここで混乱はnewキーワードなしのC++オブジェクトの作成です。私はこのオブジェクトを作成していますStudent_info info;し、ベクトルに追加します。私は新しいキーワードを使用してそれを作成していないので、スタックに割り当てられ、ループが終了した後に破棄されますか?その場合、最後のループがベクトルから情報を正しく抽出する方法は?ベクトルに追加されたすべてのオブジェクトが破棄されたので例外をスローするべきではありませんか?C++のstructオブジェクトのスコープが新しいキーワードなしで作成されました

struct Student_info { 
    string name; 
    vector<double> marks; 
}; 

int main() 
{ 
    int num = 2; 

    vector<Student_info> student_infos; 
    for (int i = 0; i < 3; i++) { 
     Student_info info; //will this object be destroyed once this loop exits? 
     cout << "Enter name:"; 
     cin >> info.name; 

     double x; 
     cout << "Enter 2 marks"; 
     for (int j = 0; j < num; j++) { 
      cin >> x; 
      info.marks.push_back(x); 
     } 
     student_infos.push_back(info); 
    } 

    for (int i = 0; i < 3; i++) { 
     cout << student_infos[i].name; 
     for (int j = 0; j < num; j++) { 
      cout << student_infos[i].marks[j]; 
     } 
     cout << endl; 
    } 
    return 0; 
} 
+0

Javaのバックグラウンドから来ているので、変数とポインタの違いを知ることをお勧めします。また、何かをパラメータとして渡すときは常にコピーされることに注意してください。代わりにポインタを使用すると、Javaの動作が得られます。次に、 '' new''キーワードを使用する必要があります。 – BrainStone

答えて

3

あなたはinfoオブジェクトが破壊されることで正しいですが、それはでは、ベクターにをコピーしました。残りのコードは、元のオブジェクトではなくベクトルからコピーを読み取ります。

http://www.cplusplus.com/reference/vector/vector/push_back/

コピーは、この場合には、コンパイラが提供され、オブジェクトのコピーコンストラクタを使用して行われます。それは構造体の文字列とベクトルメンバーのコピーコンストラクタを呼び出します。

2

はい、infoは、ループの最後に破棄されます。 push_backinfoから新しいコピーを作成するので、infoが破棄されても、そのコピーはまだベクトルに存在します。 push_backを使用した場合

3

変数infoのスコープは、変数宣言のポイントから始まるforステートメントのブロックスコープです。

for (int i = 0; i < 3; i++) { 
    Student_info info; //will this object be destroyed once this loop exits? 
    //... 
} 

ループの新しい繰り返しが実行されるたびに、名前infoの新しいオブジェクトが作成されます。

変数student_infosのスコープは、変数が宣言されている関数mainの最も外側のブロックスコープです。

int main() 
{ 
    vector<Student_info> student_infos; 
    //... 
} 

ループが実行されると、新しいオブジェクトが変数infoのコピーであるベクトルに加算されます。このベクトルには、元のオブジェクトへの参照が含まれていません。名前はinfoです。オブジェクトのコピーを作成し、それを内部的に内部に格納します。

は、一般的にはこれらのループ

for (int i = 0; i < 3; i++) { 
    cout << student_infos[i].name; 
    for (int j = 0; j < num; j++) { 
     cout << student_infos[i].marks[j]; 
    } 
    cout << endl; 
} 

が危険であることを考慮してください。ベクトルの実際の要素数に依存するほうがはるかに優れています。あなたは一backが行われたときに代わりに

for (vector<Student_info>::size_type i = 0; i < student_infos.size(); i++) 
{ 
    cout << student_infos[i].name; 
    for (vector<double>::size_type j = 0; j < student_infos[i].marks.size(); j++) 
    { 
     cout << student_infos[i].marks[j]; 
    } 
    cout << endl; 
} 
関連する問題