C++ c+中struct对象的作用域+;创建时不使用新关键字

C++ c+中struct对象的作用域+;创建时不使用新关键字,c++,scope,declaration,C++,Scope,Declaration,来自Java背景的以下代码让我感到困惑。这里混淆的是C++对象创建,没有新< /Cord>关键字。我正在创建此对象学生信息然后将其添加到向量。由于我没有使用new关键字创建它,它会被分配到堆栈上,并在循环退出后被销毁吗?如果是这种情况,最后一个循环如何能够正确地从向量中提取信息?当添加到向量的所有对象都被销毁时,它不应该抛出异常吗 struct Student_info { string name; vector<double> marks; }; int main

来自Java背景的以下代码让我感到困惑。这里混淆的是C++对象创建,没有<代码>新< /Cord>关键字。我正在创建此对象
学生信息然后将其添加到向量。由于我没有使用new关键字创建它,它会被分配到堆栈上,并在循环退出后被销毁吗?如果是这种情况,最后一个循环如何能够正确地从向量中提取信息?当添加到向量的所有对象都被销毁时,它不应该抛出异常吗

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;
}
struct学生信息{
字符串名;
矢量标记;
};
int main()
{
int num=2;
矢量学生信息;
对于(int i=0;i<3;i++){
Student_info;//一旦这个循环退出,这个对象会被销毁吗?
cout>info.name;
双x;
cout>x;
信息标记。推回(x);
}
学生信息。推回(信息);
}
对于(int i=0;i<3;i++){

是的,
info
将在循环结束时被销毁。
push_back
info
创建一个新的副本,因此即使
info
被销毁,它的副本仍然存在于向量中。

正确的是,
info
对象将被销毁,但当n使用
push_back
。其余代码从矢量而不是原始对象读取副本


复制是使用对象的复制构造函数完成的,在本例中,该构造函数由编译器提供。它将依次调用结构的字符串和向量成员上的复制构造函数。

变量的作用域
info
是for语句的块作用域,从变量的声明点开始

for (int i = 0; i < 3; i++) {
    Student_info info; //will this object be destroyed once this loop exits?
    //...
}
执行循环时,一个新对象被添加到向量中,该向量是变量
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;
}
for(int i=0;i<3;i++){

当push\u back完成时,cout会将temp学生信息复制到学生信息中。如果您可以为学生信息编写自定义复制构造函数,并在那里打印一些内容,您将看到复制构造将被调用。 考虑使用,

由于您来自Java背景,我建议您了解变量和指针之间的区别!还要记住,无论何时您将某个变量作为参数传递,它都会被复制。当您使用指针时,您会得到Java行为。然后您还必须使用
new
关键字。
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;
}
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;
}