2015-04-22 3 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++, btw, а не C. – Carlton

ответ

1

Для классов, не имеющие определенного пользователя оператора присваивания (конструктор копирования), компилятор генерирует один по умолчанию (из них), который присваивает (копию) все член от простого присваивания. Так, в случае студента, по умолчанию operator= будет выглядеть следующим образом:

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

While конструктор копирования:

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

Это означает, что перед этой линии:

delete s; 

s, s1 и s2 имеют name, указывающие на то же расположение памяти. Если s содержит любые выделенные данные там, используя его внутри s1 или 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; 
}; 

Определить новый класс с именем «Студент», который содержит одну переменную с именем «имя». «имя» является закрытым и, следовательно, доступ к нему может выполняться только членами класса. 'name' является указателем на char и поэтому может использоваться для указания массивов символов.

int main() 
{ 

Начать определение основной программы, точка входа нашей программы

Student *s = new Student(); 

Определить указатель на объект Student с именем s. 'new Student()' выделяет память для объекта Student. s хранит адрес выделенной памяти. Примечание: переменная 'name' в классе Student, на которую указывает s, не инициализируется.

Student s1 = *s; 

Определить новый объект-ученик s1 и инициализировать его, скопировав объект-ученик, на который указывает s. Переменная 'name' в s1 копирует (не инициализированное!) Значение переменной 'name' в классе Student, на которое указывает s.

Student s2; 

Определить новый объект-ученик s2. s2 инициализируется по умолчанию.

s2 = s1; 

инициализация s2 копирования s1

delete s; 

удалить объект Student выделенный в пространстве памяти указываемого с

return 0; 

завершить программу, возвращая 0 вызывающий процесс

Смежные вопросы