Имя_класса::имя_метода(спецификация_параметров)

{определения_и_операторы метода}

После скобки, закрывающей список параметров, может быть помещено в виде суффикса служебное слово const. Его присутствие указывает, что с помощью действий метода невозможно изменить поля данных того объекта, для которого метод вызывается.

 

Рассмотрим пример программы, в которой описан класс student. В функции main, являющейся клиентом класса student, осуществляется проверка методов класса student. Для того, чтобы стало понятно в каком порядке вызываются конструкторы и деструктор добавим в их коды вывод соответствующих сообщений на экран дисплея.

 

//Листинг 14.1

#include<iostream>

#include<cstring>

using namespace std;

class student {

private:

char *name; //фамилия студента

int number; //номер зачетной книжки

public:

student(); //конструктор с умолчанием

student(char*,int); //конструктор с параметрами

//конструктор копирования

student(const student& ob);

student(int); //конструктор преобразования

student(char*); //конструктор преобразования

~student(void); //деструктор

 

//функции-элементы изменения закрытых данных

void setname(char*); //изменяет фамилию студента

void setnumber(int); //изменяет номер зачетки

//функции-элементы чтения закрытых данных

//возвращает фамилию студента

const char* getname(void);

//возвращает номер зачетки

int getnumber(void);

};

//конструктор с умолчанием (без параметров)

student::student()

{

name=0;

number=0;

cout<<"constructor without parameters\n";

}

//конструктор с параметрами динамически выделяет память для фамилии и //использует функцию strcpy, чтобы скопировать фамилию в объект

student::student(char* fam,int num)

{ name=new char[strlen(fam)+1];

strcpy(name,fam);

number=num;

cout<<"constructor for "<<name<<endl;

}

//конструктор копирования

student::student(const student& ob)

{ number=ob.number;

name=new char[strlen(ob.name)+1];

strcpy(name,ob.name);

cout<<"constructor copy "<<name<<endl;

}

//конструктор преобразования

student::student(int num)

{//используем значение поля name по умолчанию

name=0;

number=num;

cout<<"constructor preobrazovania"<<number<<endl;

}//конструктор преобразования

student::student(char* fam)

{ name=new char[strlen(fam)+1];

strcpy(name,fam);

//используем значение поля number по умолчанию

number=555;

cout<<"constructor preobrazovania "<<name<<endl;

}//деструктор

student::~student(void)

{

cout<<"destructor "<<name<<endl;

delete [] name; //освобождение памяти

}

 

void student::setname(char *fam)

{

delete [] name; //освобождение памяти от прежней фамилии

name=new char[strlen(fam)+1]; //выделение памяти для новой фамилии

strcpy(name,fam); //запись в память новой фамилии

}

void student::setnumber(int n){ number=n;}

const char* student::getname(void)

{// const перед возвращаемым типом предотвращает изменение

//клиентом закрытых данных

return name;

}

int student::getnumber(void)

{return number; }

 

//проверка класса student

int main()

{

int n,nm;

char temp[20];

student stud1("Petrov",563); //определение объекта класса

student &st=stud1; //определена ссылка на объект

//инициализация объекта, который является копией объекта

//того же самого классавызывается конструктор копирования

student stud2(stud1);

cout<<stud1.getname()<<"\t"<<st.getnumber()<<endl;

cout<<stud2.getname()<<"\t"<<stud2.getnumber()<<endl;

//вызывается конструктор преобразования

student stud3(12345);

//создается временный неименованный объект

//для этого объекта вызывается конструктор преобразования

student stud4="Ivanov";

cout<<stud4.getname()<<"\t"<<stud4.getnumber()<<endl;

cin>>n;

//оператор new динамически выделяет память для массива из n объектов //класса student n раз будет вызван конструктор с умолчанием

student *spisok= new student[n];

//с клавиатуры вводим фамилию и номер зачетки очередного студента

for(int i=0;i<n;i++)

{

cin>>temp>>nm;

spisok[i].setnumber(nm);

spisok[i].setname(temp);

cout<<spisok[i].getname()<<"\t"<<spisok[i].getnumber()<<endl;

}

//освобождение памяти от динамического

// массива объектов

delete [] spisok;

return 0;

}

Результаты выполнения программы:

constructor for Petrov

constructor copy Petrov

Petrov Petrov

Petrov 563

constructor preobrazovania 12345

constructor preobrazovania Ivanov

Ivanov 555

вводим с клавиатуры: 2

constructor without parameters

constructor without parameters

вводим с клавиатуры: Antonov 1234

Antonov 1234

вводим с клавиатуры: Smirnov 5678

Smirnov 5678

Destructor Smirnov

Destructor Antonov

Destructor Petrov

Destructor Petrov

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: