2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Объект класса и Аргумент функции
Сообщение13.01.2006, 09:15 


13/01/06
3
столкнулся с таким вопросом:
Код:
class A
{
        int    *i;
public:
         A(int n) { i=new int; *i=n; }
        ~A() { delete i; }
};

void B(A a)
{
        return;
}

void main()
{
        A       a(10);
        B(a);
}

Дык вот, когда доходит до return у функции B, то вызывается деструктор аргумента функции, который является обьектом класса A. Но поле i объекта A и аргумента функции ссылаются на одно и тоже место. Получается, что после завершения функции, мы теряем информацию на которую указывало поле i класс A. Так ? :)

 Профиль  
                  
 
 
Сообщение13.01.2006, 09:31 
Модератор
Аватара пользователя


11/01/06
5710
Так. В классе A не хватает copy-конструктора. Типа такого:
Код:
A(const A& a) { i=new int; *i=*(a.i); }

 Профиль  
                  
 
 
Сообщение13.01.2006, 09:49 


13/01/06
3
мне здесь copy-конструктор и не нужен был, задача ставилась другая :)

 Профиль  
                  
 
 
Сообщение13.01.2006, 10:15 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
undef писал(а):
мне здесь copy-конструктор и не нужен был, задача ставилась другая :)


Даже если и другая задача, без конструктора копирования здесь не обойтись. По той причине, что при передаче в функцию "по значению" , как у Вас, автоматически по-умолчанию (т.е. если отсутствует заданный Вами конструктор копирования) создается копия исходного объекта, у которой все поля равны полям исходного объекта (в том числе, и указатели-члены класса). Потом для этого объекта-копии вызывается деструктор(который освобождает память, указываемую указателями-членами :) ), а поскольку значения указателей-членов класса одинаковы, то во втором (исходном) экземпляре объекта указатели-члены уже будут указывать на уже освобожденную память.. Вот что б этих казусов не происходило, и нужен конструктор копирования, который будет корректно создавать копии, а не абы как, как это делает C++ по-умолчанию!
Уффф.. Длинно получилось и с тафтологией... :)

 Профиль  
                  
 
 
Сообщение13.01.2006, 10:18 


13/01/06
3
все, я понял смысл :D
спасибо

 Профиль  
                  
 
 
Сообщение13.01.2006, 10:34 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Вообще, если в лом делать конструктор копирования, то надо передавать объект не по значению, а по указателю или ссылке... Но лучше его все-таки сделать! :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group