Слайд 1Тема: Статические члены класса
Статические свойства
Статические методы
Слайд 2Статические члены класса
Принадлежат классу, а не объекту
существуют в единственном экземпляре
для всех объектов класса (являются общими)
используются всеми объектами класса
Создаются до
начала выполнения функции main и разрушаются после выхода из main
Два способа вызова
через любой объект класса:
any_object.static_member
через имя класса
class_name::static_member
Слайд 3Статические данные в классе String
const int max_string_length = 128;
class String
{
public:
String() ;
String( const char* ) ;
String( const String& ) ;
~String()
;
String& operator= ( const String& );
int length( ) const ;
int read( ); // чтение из stdin
void print( ) const; // вывод в stdout
char& operator[ ] ( int );
const char& operator[ ] ( int ) const;
String substring (int start, int len) const;
friend String operator+ (const String&, const String& );
private:
char text [ max_string_length+1 ];
static int concat_calls;
};
Слайд 4Файл mystring.cpp
#include “mystring.h”
#include
#include
#include
int String::concat_calls = 0
;
String String::operator+( const String& s1, const String& s2 ) {
String
both ;
if( s1.length() + s2.length() > max_string_length ) {
fprintf(stderr ,“String too long: %s + %s”, s1.text, s2.text) ;
exit(1) ;
}
String::concat_calls++ ;
strcpy( both.text , s1.text ) ;
strcat( both.text , s2.text ) ;
return both ;
}
Слайд 5Статические методы класса
Принадлежат классу, а не объекту
существуют в единственном экземпляре
для всех объектов класса (являются общими)
используются всеми объектами класса
не могут
использовать нестатические свойства вызывающего объекта
не могут использовать указатель this
Могут использовать статические свойства класса, имеют доступ к нестатическим свойствам объектов, являющихся аргументами или локальными объектами
Два способа вызова
через любой объект класса:
any_object.static_method()
через имя класса
class_name::static_method()
Слайд 6Статические методы в классе String
const int max_string_length = 128;
class String
{
public:
String() ;
String( const char* ) ;
String( const String& ) ;
~String()
;
String& operator= ( const String& );
int length( ) const ;
int read( ); // чтение из stdin
void print( ) const; // вывод в stdout
char& operator[ ] ( int );
const char& operator[ ] ( int ) const;
String substring (int start, int len) const;
static int n_concatenations();
friend String operator+ (const String&, const String& );
private:
char text [ max_string_length+1 ];
static int concat_calls;
};
Слайд 7Файл mystring.cpp
#include “mystring.h”
int String::n_concatenations() {
return concat_calls ;
}
Слайд 8Пример использования
#include “mystring.h”
#include
void main( int, char*[ ] ) {
String
firstname = “Bilbo” ,
lastname = “Baggins” ,
name ;
name = firstname + “ ”+ lastname ;
(“Name is: ” + name).print() ;
printf(“There are %d concatenations.\n”, String::n_concatenations() ) ;
}
Слайд 9Сферы приложения
Статистическая информация о классе (например, количество объектов класса, количество
вызовов какого-либо метода и т.п.)
Методы диагностики (например, сообщения об ошибках)
Слайд 10Статические методы в классе String
const int max_string_length = 128;
class String
{
public:
String() ;
String( const char* ) ;
String( const String& ) ;
~String()
;
String& operator= ( const String& );
int length( ) const ;
int read( ); // чтение из stdin
void print( ) const; // вывод в stdout
char& operator[ ] ( int );
const char& operator[ ] ( int ) const;
String substring (int start, int len) const;
friend String operator+ (const String&, const String& );
private:
char text [ max_string_length+1 ];
static void error_msg( const String& ) ;
};
Слайд 11Файл mystring.cpp
#include “mystring.h”
#include
#include
#include
void String::error_msg( const String&
s = “Error in String” ) {
fprintf(stderr , s )
; exit(1) ;
}
String String::operator+( const String& s1, const String& s2 ) {
String both ;
if( s1.length() + s2.length() > max_string_length )
error_msg( “String too long: ” + s1 + s2 ) ;
strcpy( both.text , s1.text ) ;
strcat( both.text , s2.text ) ;
return both ;
}
// ………..
Слайд 12РЕЗЮМЕ
И свойства, и методы могут быть статическими членами класса
Статические члены
принадлежат классу, а не объекту
Подчиняются правилам видимости (могут быть публичными
или приватными)