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

> Внимание!

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

> Конструкторы и деструкторы, С++
Rocket
сообщение 19.03.2008 17:25
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
volvo
сообщение 19.03.2008 17:54
Сообщение #2


Гость






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

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

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

для своего класса, и не мучайся...
 К началу страницы 
+ Ответить 
Rocket
сообщение 19.03.2008 21:07
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.03.2008 21:24
Сообщение #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
сообщение 19.03.2008 22:22
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.03.2008 22:49
Сообщение #6


Гость






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

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

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

 

- Текстовая версия 29.07.2025 15:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"