我在采访中被问到这个问题。我是C ++的新手,这个程序编译成功。有谁能告诉我这个程序到底是做什么的?
#include <iostream>
using namespace std;
class Student {
private:
char *name;
};
int main() {
Student *s = new Student();
Student s1 = *s;
Student s2;
s2 = s1;
delete s;
return 0;
}
答案 0 :(得分:1)
对于没有用户定义的赋值运算符(复制构造函数)的类,编译器生成默认的一个(1),它通过简单赋值分配(复制)所有成员。因此,如果是学生,默认operator=
将如下所示:
Student& operator=(const Strudent& rhs)
{
this->name = rhs.name;
}
复制构造函数:
Student(const Student& origin)
: name(origin.name)
{
}
这意味着,就在这一行之前:
delete s;
s
,s1
和s2
的{{1}}指向完全相同的内存位置。如果name
包含任何已分配的数据,则在s
之后使用s1
或s2
之后使用它会导致灾难。
答案 1 :(得分:0)
#include <iostream>
告诉编译器程序将使用库iostream中定义的一些函数
using namespace std;
告诉编译器使用std命名空间。基本上,我们不需要写#std。&#34;使用此命令在std命名空间中定义的函数之前。
class Student {
private:
char *name;
};
定义一个名为&#39; Student&#39;其中包含名为&#39; name&#39;的单个变量。 &#39;名称&#39;是私有的,因此只能由班级成员访问。 &#39;名称&#39;是指向char的指针,因此可用于指向字符数组。
int main()
{
开始主程序的定义,即程序的入口点
Student *s = new Student();
定义指向名为s的Student对象的指针。 &#39;新学生()&#39;为Student对象分配内存。 s存储分配的内存的地址。 注意:变量&#39; name&#39;在s指向的Student类中没有初始化。
Student s1 = *s;
定义一个新的Student对象s1并通过复制s指向的Student对象对其进行初始化。 变量&#39;名称&#39;在s1中复制变量&#39; name&#39;的值(未初始化!)在s指出的学生班。
Student s2;
定义一个新的Student对象s2。 s2默认初始化。
s2 = s1;
通过复制s1初始化s2
delete s;
删除在s
指向的内存空间中分配的Student对象return 0;
通过将0返回到调用进程
来结束程序