{определения_и_операторы метода}
После скобки, закрывающей список параметров, может быть помещено в виде суффикса служебное слово 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