2015-04-22 52 views
-8

我在面试中被问到了这个问题。我是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; 
} 
+3

你认为它有什么作用? – NathanOliver

+2

你为什么不告诉我们你的想法呢,如果你错了,我们会纠正你。你会更好地学习这种方式。 – Barmar

+0

这是C++,顺便说一句,不是C. – Carlton

回答

1

对于没有用户定义赋值运算符(复制构造)类,编译器会生成一个缺省(个),其分配(拷贝)所有成员通过简单的赋值。所以,在学生的情况下,默认operator=应该是这样的:

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

虽然拷贝构造函数:

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

这意味着,仅这行之前:

delete s; 

ss1s2已将它们的name指向完全相同的内存位置。如果s包含任何已分配的数据,那么在或s2内部使用delete会导致灾难。

+0

请注意s1和s2介于'new s'和'delete s'之间 –

+0

@DieterLücking是的,但它们是局部变量,所以它们只要执行'main'并且在'delete'之后,它们仍然可以用于对(现在)的无效内存执行进一步的操作。也许这样的解释是预期的?作为假设的雇主,如果我的潜在员工知道这样的事情,我会很高兴。 –

+0

鉴于'name'是一个狂放的(未初始化的)指针,并且它永远不会被解除引用或释放,所以我们实际上并未触及任何未定义的行为。但那么,为什么有这个成员呢? –

0
#include <iostream> 

告诉编译器程序将使用该库的iostream

using namespace std; 

定义的一些功能告诉编译器使用std命名空间。基本上,我们不需要写“std”。在此命令之后,在std命名空间中定义的函数之前。

class Student { 
    private: 
    char *name; 
}; 

定义一个名为'Student'的新类,其中包含名为'name'的单个变量。 'name'是私人的,因此只能由班级成员访问。 “name”是指向char的指针,因此可用于指向字符数组。

int main() 
{ 

启动主程序的定义,我们的节目

Student *s = new Student(); 

的切入点定义一个指针到名为秒的Student对象。 'new Student()'为Student对象分配内存。 s存储分配的内存的地址。 注意:s指向的Student类中的变量'name'未被初始化。

Student s1 = *s; 

定义一个新的Student对象s1并通过复制s指向的Student对象来初始化它。 s1中的变量'name'复制s指向的Student类中变量'name'的(未初始化的!)值。

Student s2; 

定义一个新的学生对象s2。 s2默认初始化。通过复制S1

delete s; 

删除在存储器空间中分配的Student对象

s2 = s1; 

初始化S2由s

return 0; 

指出通过返回0到调用进程

结束该程序