Программирование >>  Инициализация объектов класса, структура 

1 ... 202 203 204 [ 205 ] 206 207 208 ... 395


class Account {

public:

void raiseInterest( double incr ); double interest() { return interestRate; } private:

static double interestRate;

inline void Account::raiseInterest( double incr ) {

interestRate += incr;

статическому члену interestRate:

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

Поэтому лучше объявить такие функции-члены как статические. Это можно сделать

class Account { public:

static void raiseInterest( double incr ); static double interest() { return interestRate; } private:

static double interestRate;

inline void Account::raiseInterest( double incr ) {

interestRate += incr;

следующим образом:

Объявление статической функции-члена почти такое же, как и нестатической: в теле класса ему предшествует ключевое слово static, а спецификаторы const или volatile запрещены. В ее определении, находящемся вне тела класса, слова static быть не должно.

Такой функции-члену указатель this не передается, поэтому явное или неявное обращение к нему внутри ее тела вызывает ошибку компиляции. В частности, попытка обращения к нестатическому члену класса неявно требует наличия указателя this и, следовательно, запрещена. Например, представленную ранее функцию-член dailyReturn() нельзя объявить статической, поскольку она обращается к нестатическому члену amount.

13.5.1. Статические функции-члены

Функции-члены raiseInterest() и interest() обращаются к глобальному



#include <iostream> #include account.h

bool limitTest( double limit )

пока еще ни одного объекта класса Account не объявлено правильно: вызов статической функции-члена return limit <= Account::interest() ;

int main() {

double limit = 0.05;

if ( limitTest( limit ) )

указатель на статическую функцию-член объявлен как обычный указатель void (*psf)(double) = SAccount::raiseInterest;

psf( 0.0025 );

Account ac1( 5000, Asterix );

Account ac2( 10000, Obelix );

if ( compareRevenue( ac1, Sac2 ) > 0 ) cout << ac1.owner()

<< is richer than

<< ac2.owner() << \n ;

else

cout << ac1.owner()

<< is poorer than

<< ac2.owner() << \n ;

return 0; иллюстрирующая их применение:

Упражнение 13.8

Пусть дан класс Y с двумя статическими данными-членами и двумя статическими функциями-членами:

Статическую функцию-член можно вызвать для объекта класса, пользуясь одним из операторов доступа. Ее также можно вызвать непосредственно, квалифицировав ее имя, даже если никаких объектов класса не объявлено. Вот небольшая программа,



class X { public:

X( int i ) { val = i; } int val() { return val; } private:

int val;

class Y {

public:

Y( int i );

static X xval();

static int callsXval(); private:

static X xval;

static int callsXval;

Инициализируйте xval значением 20, а callsXval значением 0. Упражнение 13.9

Используя классы из упражнения 13.8, реализуйте обе статические функции-члена для класса Y. callsXval() должна подсчитывать, сколько раз вызывалась xval() .

Упражнение 13.10

example.h class Example { public:

static double rate = 6.5;

static const int vecSize = 20; static vector<double> vec(vecSize);

example.c

#include example.h

double Example::rate;

Какие из следующих объявлений и определений статических членов ошибочны? Почему?

vector<double> Example::vec;

13.6. Указатель на член класса

Предположим, что в нашем классе Screen определены четыре новых функции-члена: forward() , back() , up() и down() , которые перемещают курсор соответственно вправо, влево, вверх и вниз. Сначала мы должны объявить их в теле класса:



1 ... 202 203 204 [ 205 ] 206 207 208 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика