Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Конструкторы и деструкторы

Автор: Rocket 19.03.2008 21:25

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


#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



Автор: volvo 19.03.2008 21:54

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

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

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

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

Автор: Rocket 20.03.2008 1:07

Цитата(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;
}

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

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

И ещё, как перегрузить операцию присваивания?

Автор: volvo 20.03.2008 1: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;
}


Автор: Rocket 20.03.2008 2:22

Цитата(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;
}


При перегрузке вывода в поток какие параметры передаются?
В чем отличие операции присваивания от конструктора копирования?

Автор: volvo 20.03.2008 2:49

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

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