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