IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Конструкторы и деструкторы, С++
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Создал структуру "Студент". Определил конструктор для инициализации полей структуры со
значениями по умолчанию. Определил конструктор копирования и деструктор.


#include <iostream>
using namespace std;

struct Student{

char Sirname[255];
char Name[255];
char Patronymic[255];
int Year;
char Team[255];

Student(const char *sn, const char *n, const char *p, int y,const char *t)
{ strcpy(Sirname,sn );
strcpy(Name,n);
strcpy(Patronymic,p);
Year=y;
strcpy(Team,t);
cout<<"Constructor On"<<endl;
};

Student(const Student &st)
{ strcpy(Sirname,st.Sirname );
strcpy(Name,st.Name);
strcpy(Patronymic,st.Patronymic);
Year=st.Year;
strcpy(Team,st.Team);
cout<<"Copy-constructor On"<<endl;
};

~Student()
{ cout<<"Destructor On"<<endl;
};

int Test1(const char *p)
{
};

void Test2()
{
};

};

int main()

{ cout<<"Enter function main()"<<endl;


Student st("Ivanov", "Ivan", "Ivanovich",1989,"AKB21"), st1(st);


cout << st.Sirname << " " << st.Name << " " << st.Patronymic << " " << st.Year << " "<<st.Team<<endl;
cout << st1.Sirname << " " << st1.Name << " " << st1.Patronymic << " " << st1.Year << " "<<st1.Team<<endl;
cout<<"Exit function main()"<<endl;


return 0;
}


Также нужно внести в класс тестовую функцию, изменяющую первую букву отчества на 'Ы' для проверки корректности конструктора,ну и функцию, выводящую значения всех полей на экран для проверки работы этой функции. Подскажите, как реализовать данные функции. smile.gif


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
функцию, изменяющую первую букву отчества на 'Ы' для проверки корректности конструктора
Как связано между собой изменение поля и корректность конструктора, объясни? Корректность конструктора проверяется выводом на печать сконструированного объекта.

Цитата
ну и функцию, выводящую значения всех полей на экран для проверки работы этой функции
Перегружай

ostream& operator << (ostream& os, Student& st) {
cout <<
st.Surname << " " << st.Name << " " << st.Patronymic << " " <<
st.Year << " " <<st.Team;
return os;
}

для своего класса, и не мучайся...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 19.03.2008 17:54) *

Как связано между собой изменение поля и корректность конструктора, объясни? Корректность конструктора проверяется выводом на печать сконструированного объекта.


В принципе получается , что особо-то и не связана, но она должна иметь место в программе...

Цитата(volvo @ 19.03.2008 17:54) *

Перегружай

ostream& operator << (ostream& os, Student& st) {
cout <<
st.Surname << " " << st.Name << " " << st.Patronymic << " " <<
st.Year << " " <<st.Team;
return os;
}

для своего класса, и не мучайся...

Данная перегрузка является перегрузкой операции вставки в поток?

И ещё, как перегрузить операцию присваивания?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Это перегрузка операции вставки вывода в поток...

Вот так?

#include <iostream>
using namespace std;

struct Student {
// на всякий случай делаем другом, если перенесешь поля в private секцию...
friend ostream& operator << (ostream&, Student&);

Student(const char *sn, const char *n, const char *p, int y, const char *t) {
strcpy(Surname, sn); strcpy(Name, n); strcpy(Patronymic, p);
Year = y;
strcpy(Team,t);
cout<<"Constructor On"<<endl;
}
Student(Student &st) {
init(st);
cout << "X(X&) constructor" << endl;
}
~Student()
{
cout<<"Destructor On"<<endl;
}

// вот оператор присваивания
Student& operator = (const Student &st) {
init(st);
return *this;
}

// вот тестовая функция
void Test() {
Patronymic[0] = 'Y';
}

char Surname[255];
char Name[255];
char Patronymic[255];

int Year;
char Team[255];

private:
void init(const Student& st) {
strcpy(Surname, st.Surname );
strcpy(Name, st.Name);
strcpy(Patronymic, st.Patronymic);
Year = st.Year;
strcpy(Team, st.Team);
}

};

ostream& operator << (ostream& os, Student& st) {
cout <<
st.Surname << " " << st.Name << " " << st.Patronymic << " " <<
st.Year << " " <<st.Team;
return os;
}


int main(int argc, char *argv[])
{
Student st("Ivanov", "Petr", "Alekseevich", 1989, "AKB21"), st1(st);

cout << st << endl;
st.Test();
cout << st << endl;
cout << st1 << endl;
return 0;
}

 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 19.03.2008 21:24) *

Это перегрузка операции вставки вывода в поток...

Вот так?

#include <iostream>
using namespace std;

struct Student {
// на всякий случай делаем другом, если перенесешь поля в private секцию...
friend ostream& operator << (ostream&, Student&);

Student(const char *sn, const char *n, const char *p, int y, const char *t) {
strcpy(Surname, sn); strcpy(Name, n); strcpy(Patronymic, p);
Year = y;
strcpy(Team,t);
cout<<"Constructor On"<<endl;
}
Student(Student &st) {
init(st);
cout << "X(X&) constructor" << endl;
}
~Student()
{
cout<<"Destructor On"<<endl;
}

// вот оператор присваивания
Student& operator = (const Student &st) {
init(st);
return *this;
}

// вот тестовая функция
void Test() {
Patronymic[0] = 'Y';
}

char Surname[255];
char Name[255];
char Patronymic[255];

int Year;
char Team[255];

private:
void init(const Student& st) {
strcpy(Surname, st.Surname );
strcpy(Name, st.Name);
strcpy(Patronymic, st.Patronymic);
Year = st.Year;
strcpy(Team, st.Team);
}

};

ostream& operator << (ostream& os, Student& st) {
cout <<
st.Surname << " " << st.Name << " " << st.Patronymic << " " <<
st.Year << " " <<st.Team;
return os;
}
int main(int argc, char *argv[])
{
Student st("Ivanov", "Petr", "Alekseevich", 1989, "AKB21"), st1(st);

cout << st << endl;
st.Test();
cout << st << endl;
cout << st1 << endl;
return 0;
}


При перегрузке вывода в поток какие параметры передаются?
В чем отличие операции присваивания от конструктора копирования?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
При перегрузке вывода в поток какие параметры передаются?
Что, по исходнику не видно? Первый - ссылка на поток вывода, второй - ссылка на экземпляр объекта...

Цитата
В чем отличие операции присваивания от конструктора копирования?
В том, что операция присваивания возвращает ссылку (объект должен быть уже создан), а конструктор - сам объект.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 22:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name