Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2013, 15:15   #1
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию Обьясните пожалуста как и что делает эта программа и почему она это делает.

Особено непонятно, что же передается в функцию. Передается обьект. Я более менее понимаю, что в функцию может пиредаваться переменная, с не могут происходить различные действия. Что значит, если в функцию передается обьект? Что с ним можно делать? как все это понять?
Ведь обьект- это обьект, который может иметь свойства (как определенная кошка может иметь цвет, вес, возраст) выражающися переменными?И уже их можно передавать и совершать с ними действия?

Что это за конструктор копирования? Как простой конструктор и конструктор копирования соотносятся друг с другом? и что и зачем мы в него передаем? У нас SimpleCat-это класс. Зачем его, или его копию передавать в конструктор? Что можно и что вобще нужно делать с помощю такого конструктора?

Дальше, совершено уж непонятно. После передачи в функцию Function0ne обьекта Frisky конструктор копирования вызывается дважды.
И деструктор дважды!!! И функция не распечатывает сообщения коут из себя самой. Вот дела!! У меня все извилины спутались и свернулись.
А после передачи в функцию FunctionTwo, обьекта Фриски как ссылки
распечатался коут из функции, а конструктор-деструктор не вызывался. Чудеса и непонятка, полнейшая!!!
А простите пожалуста, обе функции распечатывают сообщения из своего тела. Но общий смысл всего очень очень малопонятен.. Причем сообщение от первой функции происходит как раз между обоими вызовами конструктора копирования!
А, это так видимо и задумано- при создании какого-нь обьекта, всегда вызывается конструктор, а при передаче этого обьекта в функцию- конструктор копирования, если вызывается вобще!
Не, в общем почти совсем почти ничего не понятно.

Код:
// Листинг 9.10.
 // Передача указателей на объекты

#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл смело и не раздумывая  вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.


 class SimpleCat
 {
public:
SimpleCat (); // конструктор
SimpleCat(SimpleCat&); // конструктор-копировщик
 ~SimpleCat(); // деструктор
 };

 SimpleCat::SimpleCat()
 {
cout << "Simple Cat Constructor...\n";
 }
 SimpleCat::SimpleCat(SimpleCat&)
 {
cout << "Simple Cat Copy Constructor...\n";
 }

 SimpleCat::~SimpleCat()
 {
cout << "Simple Cat Destructor...\n";
 }

 SimpleCat Function0ne (SimpleCat theCat);
 SimpleCat* FunctionTwo (SimpleCat *theCat);

 int main()
 {
cout << "main()SimpleCat Frisky;\n";
SimpleCat Frisky;     // Вызываем конструктор раз.

cout << "main()FunctionOne(Frisky);\n";
Function0ne(Frisky);// Функция FunctionOne, передача как значения. Конструктор копирования вызывается дважды!!!
//И деструктор дважды!!!
cout << "main()FunctionTwo(&Frisky);\n";
FunctionTwo(&Frisky); // Функция FunctionTwo, передача как ссылки. Не вызываются конструктор-деструктор!!!
//Печатается коут из функции!!!
system("pause  ");
return 0;
 }

// Функция FunctionOne, передача как значения
SimpleCat Function0ne(SimpleCat theCat)
 {
cout << "Function One. Roturning,,,"<<theCat<<"theCat\n";
return theCat;
 }

 // Функция FunctionTwo, передача как ссылки
 SimpleCat* FunctionTwo (SimpleCat *theCat)
 {
cout << "Function Two. Returning..."<<theCat<<"theCat\n";
return theCat;
 }
Dimka-novitsek вне форума Ответить с цитированием
Старый 15.10.2013, 16:25   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Думаю, вам следует почитать книгу - Герберт Шилдт - C++
Там ответы на все Ваши вопросы.
Igor95 вне форума Ответить с цитированием
Старый 15.10.2013, 17:22   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

SimpleCat::SimpleCat(SimpleCat&) не есть copy конструктор.
должен быть const SimpleCat&
А для того, чтоб жизнь была интересней, еще есть и оператор присваивания operator =
waleri вне форума Ответить с цитированием
Старый 15.10.2013, 18:46   #4
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Не конструктор? Вот это да! Но это из книги. Я правда добавил, но исключительно по мелочи- комментарии за слешами,строку system("pause "); ,вывод из коутов.
Константы там не было!
Dimka-novitsek вне форума Ответить с цитированием
Старый 15.10.2013, 20:34   #5
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
SimpleCat::SimpleCat(SimpleCat&) не есть copy конструктор.
должен быть const SimpleCat&
А для того, чтоб жизнь была интересней, еще есть и оператор присваивания operator =
Почему же? Отсутствие спецификатора const перед идентификатором аргумента не говорит о том, что это не конструктор копирования. Это говорит о плохом тоне использования конструктора копирования
Igor95 вне форума Ответить с цитированием
Старый 15.10.2013, 20:44   #6
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Спасибо!!!
Dimka-novitsek вне форума Ответить с цитированием
Старый 16.10.2013, 06:10   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Классы в плюсах - это определяемые пользователем типы, которые можно использовать точно так же, как переменные типов int, char, bool и т.д. (обычно для этого, правда, нужно обеспечить им нужную функциональность перегрузив, например, операторы =, ==, +, -, <<, >> и т.п.). Так что можете смотреть на объекты как на обычные переменные.

Конструктор копирования вызывается когда вы создаете новый объект, инициализируя его значением другого объекта строго того же типа:
Код:
class AAA;
AAA a;   //Вызывается обычный конструктор
AAA b = a;   //Инициализация объекта в нотации Type NewObj = OldObj; вызывается конструктор копирования
AAA c(a);   //Также инициализация, но в нотации Type NewObj(OldObj); конструктор копирования
b = c;   //Объект b был создан ранее, он уже не инициализируется, ему присваивается значение с помощью operator=
Объявление обычного и copy-конструктора:
Код:
class BBB
{
public:
BBB(int _b);
BBB(const BBB& _bbb);
private:
int b;
};
BBB::BBB(int _b): b(_b)
 {}   //Использован список инициализации. Можно также, но это менее правильно, написать в теле конструктора b =  _b;
BBB::BBB(const BBB& _bbb): b(_bbb.b)
 {}   //Здесь можно b = _bbb.b; вместо b(_bbb.b)
Они друг от друга не зависят. Конструктор копирования инициализируется одним аргументом, имеющим тот же тип (правильнее всего передавать по const-ссылки), обычный - данными других типов.

Вы передаете объект не по ссылке, а по указателю. Нужно заменить * на &.
Код:
// Функция FunctionOne, передача как значения
SimpleCat Function0ne(SimpleCat theCat)   //Передача theCat по значению - при этом создается новый объект этого типа, инициализирующийся через конструктор копирования тем объектом, который был в вызывающей функции
 {
cout << "Function One. Roturning,,,"<<theCat<<"theCat\n";   //Вы снова передаете в функцию theCat по ссылке (в operator<<(std::ostream, SimpleCat), снова создается новый объект)
//Когда функция вывода отработала, в ней вызывается деструктор
return theCat;
 } //Когда отработала эта функция, также вызывается деструктор

 // Функция FunctionTwo, передача как ссылки
SimpleCat* FunctionTwo (SimpleCat *theCat)   //Передача указателя на объект, объекта, содержащего его адрес в памяти. Никакой объект типа SimpleCat не создается
 {   //Даже если бы была ссылка, все равно новые объекты не создавались бы, поэтому ссылки и используют, чтоб не тратить память и процессорное время на создание/уничтожение объектов
cout << "Function Two. Returning..."<<theCat<<"theCat\n";   //Снова передаем указатель
return theCat;
 }   //Раз новые объекты не создавались, они не уничтожаются, деструкторы не вызываются
Цитата:
А, это так видимо и задумано- при создании какого-нь обьекта, всегда вызывается конструктор, а при передаче этого обьекта в функцию- конструктор копирования, если вызывается вобще!
При создании объекта всегда вызывается конструктор. Если он инициализируется значением того же типа (как при передаче в качестве аргумента функции по значению) - вызывается конструктор копирования. Иначе вызывается подходящий обычный конструктор.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.10.2013, 12:02   #8
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

СПАСИБО!!!!!!!!!!!!
Dimka-novitsek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что делает эта программа?(код) Kampainn5 Общие вопросы по Java, Java SE, Kotlin 2 19.09.2012 22:24
Обьясните, что делает это программа??? ~Леди~ Общие вопросы Delphi 2 05.04.2011 10:47
Что делает эта строчка??? marselik Общие вопросы C/C++ 2 02.11.2009 13:54
Что делает эта прога StudentPolitech Общие вопросы C/C++ 1 25.03.2009 22:54
что делает эта программа и где ошибка? дангер Паскаль, Turbo Pascal, PascalABC.NET 27 28.01.2008 13:38