![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Rocket |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Создал структуру "Студент". Определил конструктор для инициализации полей структуры со
значениями по умолчанию. Определил конструктор копирования и деструктор.
#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;
}
Также нужно внести в класс тестовую функцию, изменяющую первую букву отчества на 'Ы' для проверки корректности конструктора,ну и функцию, выводящую значения всех полей на экран для проверки работы этой функции. Подскажите, как реализовать данные функции. ![]() |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата функцию, изменяющую первую букву отчества на 'Ы' для проверки корректности конструктора Как связано между собой изменение поля и корректность конструктора, объясни? Корректность конструктора проверяется выводом на печать сконструированного объекта.Цитата ну и функцию, выводящую значения всех полей на экран для проверки работы этой функции Перегружайostream& operator << (ostream& os, Student& st) {
cout <<
st.Surname << " " << st.Name << " " << st.Patronymic << " " <<
st.Year << " " <<st.Team;
return os;
}
для своего класса, и не мучайся... |
Rocket |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Как связано между собой изменение поля и корректность конструктора, объясни? Корректность конструктора проверяется выводом на печать сконструированного объекта. В принципе получается , что особо-то и не связана, но она должна иметь место в программе... Перегружай ostream& operator << (ostream& os, Student& st) {
cout <<
st.Surname << " " << st.Name << " " << st.Patronymic << " " <<
st.Year << " " <<st.Team;
return os;
}
для своего класса, и не мучайся...Данная перегрузка является перегрузкой операции вставки в поток? И ещё, как перегрузить операцию присваивания? |
volvo |
![]()
Сообщение
#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;
}
|
Rocket |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Это перегрузка операции Вот так? #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 |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата При перегрузке вывода в поток какие параметры передаются? Что, по исходнику не видно? Первый - ссылка на поток вывода, второй - ссылка на экземпляр объекта...Цитата В чем отличие операции присваивания от конструктора копирования? В том, что операция присваивания возвращает ссылку (объект должен быть уже создан), а конструктор - сам объект. |
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 15:16 |