Метод деления денег обычно используется, чтобы выяснить, во сколько раз одна сумма превосходит другую. Поэтому делятся абсолютные значения денежных сумм.
Надо сказать еще несколько слов о методе ввода. Ввод рублей и копеек разделен. При вводе рублей мы отсекаем дробную часть, если пользователь нечаянно ее задаст.
Если вы заметили, методы (кроме методов ReadMoney() и InitO) не изменяют значения полей текущего объекта. Именно поэтому мы почти во всех методах объявили локальную переменную типа TMoney, значение которой и возвращаем в качестве результата. Если в дальнейшем у нас появятся методы, изменяющие состояние полей текущего объекта, то мы сможем возвращать значение *thi s текущего объекта оператором return:
return *this;
Размеры объектов класса
В связи с тем, что методы можно объявлять внутри класса, нужно разобраться, влияет ли размер метода на размер класса в памяти? И сколько байтов выделяет компилятор для класса и для структуры — одинаковы ли эти значения? Как обычно, это можно сделать с помощью функции si zeof (тип) (см. п. п. 5.3.3 в [1]). Интересно также выяснить, выделяется ли память для «пустых» классов, не содержащих ни полей, ни методов. Напишем простую программу, текст которой приведен в листинге 1.16.
// пустой класс // пустая структура // одно поле
struct st2{ char t;}; struct st3{ int t;}; struct st4{ long t;}; class ct41{ double t;}; struct st41{ double t;}; class ct5{ long double t;}; struct-st5{ long double t;}; // два поля
};
long double t;};
class ct6{ char r; long t;}; struct st6{ char r; long t; class ct7{ char r; long double t;}; struct st7{ char r; // один метод
class ctl0{ void f(void) { int a = 1; } }; struct stl0{void f(void) { int a = 1; } }; // поле и метод
cout <<"Empty cout <<"class "
<< sizeof(ctl) '<< sizeof(ct2) '<< sizeof(ct3) '<< sizeof(ct4)
class ctl2{ int t; void f(void) { int a = 1; } }; struct stl2{int t; void f(void) { int a = 1; } }; int main() {
cout cout cout cout cout cout
'char
'class
'int
'class
'long
'class
structure "<< sizeof(stl)<< endl;
structure "<< sizeof(st2)<< endl;
structure "<< sizeof(st3)<< endl;
cout <<"long double "; cout <<"class "<< sizeof(ctS) cout <<"char,long ";
structure "<< sizeof(st4)<< endl;
structure "<< sizeof(st5)<< endl;
Листинг 1.16 (продолжение)
cout <<"class н<< sizeof(ct6) << "; structure "<< sizeof(st6)<< endl; cout <<"char,long dbl ";
cout <<"class "<< sizeof(ct7) << "; structure "<< sizeof(st7)<< endl; cout <<"only method ";
cout <<"class "<< sizeof(ctl0) << "; structure "<< sizeof(stl0)<< endl; cout <<"int, method ";
cout <<Mclass M<< sizeof(ctl2) << "; structure "<< sizeof(stl2)<< endl;
getchar(); // остановка, чтобы посмотреть результаты
return 0;
}
Результат работы этой программы в системе Visual C++.NET 2003 выглядит так:
Empty class 1; structure 1
char class 1; structure 1
int class 4; structure 4
long class 4; structure 4
double class 8; structure 8
long double class 8; structure 8
char,long class 8; structure 8
char,long dbl class 16; structure 16
only method class 1; structure 1
int, method class 4; structure 4
|