Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
И наконец, в статических членах можно хранить указатель на первый элемент связанного списка. Таким образом, статические члены могут содержать любую информацию "общего использования", которая будет доступна для всех объектов и во всех функциях ( не стоит забывать, однако, что чрезмерное использование статических переменных усложняет поиск ошибок в программе ).
___________________
15Вообще говоря, это зависит от используемого компилятора. Так, тот же Dev-C++ вызовет данную функцию, в чём легко убедиться, скомпилировав и выполнив приведённый пример ( дополнив его, естественно, функцией main( ) , в которой вызывается fn( ) ). — Прим. ред.
16Ещё одно замечание: в этом случае вы должны позаботиться о том, чтобы счётчик увеличивался во всех конструкторах, включая конструктор копирования. — Прим. ред.
_________________
227 стр. Глава 19. Статические члены
►Оъявление статических функций-членов...228
Функции-члены также могут быть объявлены статическими. Подобно статическим данным-членам, они связаны с классом, а не с каким-либо отдельным объектом класса. Это означает, что обращение к статическим функциям-членам, как и к статическим данным-членам, не требует наличия объекта. Если объект и присутствует, то используется только его тип.
«Таким образом, оба вызова статической функции-членаnumber( ) в приведённой ниже программе корректны.»
[ Диск ]
//
/* CallStaticMember — два способа вызова */
/* статической функции-члена */
//
#include
#include
#include
#include
using namespace std ;
class Student
{
public :
Student( char* pN = "no name" )
{
pName = new char[ strlen( pN ) + 1 ] ;
if ( pName )
{
strcpy( pName , pN ) ;
}
noOfStudents++ ;
}
~Student ( ) { noOfStudents-- ; }
static int number( ) { return noOfStudents ; }
/* ...Всё прочее — как и раньше... */
protected :
char* pName ;
static int noOfStudents ;
} ;
int Student::noOfStudents = 0 ;
int main( int argcs , char* pArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale ( LC_ALL , ".1251" ) ;
Student s1( "Chester" ) ;
Student s2 ( "Scooter" ) ;
cout << "Количество студентов — "
<< s1.number( ) << endl ;
cout << " Количество студентов — "
<< Student::number( ) << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ;
return 0 ;
}
Количество студентов — 2
Количество студентов — 2
Press any key to continue...
_________________
228 стр. Часть 3. Введение в классы
Обратите внимание на то, как статическая функция-член обращается к статическим данным-членам. Поскольку статическая функция-член не связана с каким-либо объектом, она не может неявно обращаться к нестатическому члену. Таким образом, приведённый ниже пример неправилен.
class Student
{
public :
/* Приведённый ниже код неверен */
static char *sName( )
{
return pName ; /* Какое именно имя? */
}
/* ...всё остальное то же, что и ранее... */
protected :
char * pName ;
static int noOfStudents ;
} ;
Это не означает, что статические функции-члены не имеют доступа к нестатическим данным-членам. Рассмотрим следующий пример, в котором функция findName( ) используется для поиска объекта в связанном списке ( о том, как работают связанные списки, рассказывается в главе 14, "Указатели на объекты"). Здесь приводится только относящаяся к нашему рассмотрению часть кода; всё остальное вы можете дописать самостоятельно, в качестве небольшого домашнего задания.
class Student
{
public :
Student ( char *pName )
{
/* Создаёт объект и добавляет его в список */
}
static Student* findName( char *pName )
{
/* Ищет объект в списке, на который указывает указатель pHead */
}
protected :
static Student *pHead ;
Student *pNext ;
char* pName ;
} ;
Student* Student::pHead = 0
Функция findName( ) имеет доступ к pHead , поскольку этот указатель доступен для всех объектов. Так как findName является членом класса Student , он имеет доступ к членам pNext объектов. Этот доступ позволяет функции проходить по списку в поисках требуемого объекта. Вот как используется такая функция.
int main( int argcs , char* pArgs[ ] )
{
Student s1( "Randy" ) ;
Student s2( "Jenny" ) ;
Student s3( "Kinsey" ) ;
Student *pS = s1.findName( "Jenny" ) ;
return 0 ;
}
_________________
229 стр. Глава 19. Статические члены
►Что такое this...230
Я уже упоминал несколько раз о том, что такое this , но тем не менее давайте ещё раз разберёмся в этом вопросе, this — это указатель на текущий объект внутри функции-члена. Он используется, когда не указано другое имя объекта. В обычной функции-члене this — скрытый первый аргумент, передаваемый функции.
class SC
{
public :
void nFn( int a ) ;
/* To же, что и SC::nFn( SC *this , int a ) */
static void sFn( int a ) ;
/* To же, что и SC::sFn( int a ) */
} ;
void fn( SC & s )
{
s.nFn( 10 ) ; /* Преобразуется в SC::nFn( & s , 10 ) ; */
s.sFn( 10 ) ; /* Преобразуется в SC::sFn( 10 ) ; */
}
Таким образом, функция nFn( ) интерпретируется так же, как если бы мы объявили её void SC::nFn( SC *this , int a ) . При вызове nFn( ) неявным первым аргументом ей передаётся адрес s ( вы не можете записать вызов таким образом, поскольку передача адреса объекта — дело компилятора ).
Обращения к другим, нестатическим членам из функции SC::sFn автоматически используют аргумент this как указатель на текущий объект. Однако при вызове статической функции SC::sFn( ) адрес объекта ей не передаётся и указателя this , который можно использовать при обращении к нестатическим членам, не существует. Поэтому мы и говорим, что статическая функция-член не связана с каким-либо текущим объектом.
_________________
230 стр. Часть 3. Введение в классы
ОГЛАВЛЕНИЕ
СОДЕРЖАНИЕ
Глава 20. НАСЛЕДОВАНИЕ КЛАССОВ...233
Глава 21. ЗНАКОМСТВО С ВИРТУАЛЬНЫМИ ФУНКЦИЯМИ-ЧЛЕНАМИ: НАСТОЯЩИЕ ЛИ ОНИ...240
Глава 22. РАЗЛОЖЕНИЕ КЛАССОВ...249
В этой части...
Из дискуссии по вопросам объектно-ориентированной философии в части 3 становится ясно, что в реальном мире существует две вещи, которые нельзя выразить с помощью функционально-ориентированных программ.
Читать дальшеИнтервал:
Закладка: