输出基于指针的程序

时间:2015-04-22 20:06:40

标签: c++

我在采访中被问到这个问题。我是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;
}

2 个答案:

答案 0 :(得分:1)

对于没有用户定义的赋值运算符(复制构造函数)的类,编译器生成默认的一个(1),它通过简单赋值分配(复制)所有成员。因此,如果是学生,默认operator=将如下所示:

Student& operator=(const Strudent& rhs)
{
    this->name = rhs.name;
}

复制构造函数:

Student(const Student& origin)
: name(origin.name)
{
}

这意味着,就在这一行之前:

delete s;

ss1s2的{​​{1}}指向完全相同的内存位置。如果name包含任何已分配的数据,则在s之后使用s1s2之后使用它会导致灾难。

答案 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返回到调用进程

来结束程序