Классы и функции-члены

Содержание

Слайд 2

Классы и структуры struct TypeName { // неименованный раздел private: //

Классы и структуры

struct TypeName {
// неименованный раздел
private:
// закрытая часть
public:
// открытая

часть
protected:
// защищенная часть
};

class TypeName {
// неименованный раздел
private:
// закрытая часть
public:
// открытая часть
protected:
// защищенная часть
};

Слайд 3

Методы и свойства class Point { public: // открытая часть –

Методы и свойства

class Point {
public:
// открытая часть – для методов
void

setX( float );
void setY( float );
float getX( ) const;
float getY( ) const;
private:
// закрытая часть – для свойств
float x, y ;
};

void Point::setX( float val ) {
x = val ;
}
void Point::setY( float val ) {
y = val ;
}
float Point::getX( void ) {
return x ;
}
float Point::getY( void ) {
return y ;
}

Слайд 4

Простой класс String class String { public: void set_to( char* );

Простой класс String

class String {
public:
void set_to( char* );
int length( );
int

read( ); // чтение из stdin
void print( ); // вывод в stdout
private:
// детали реализации
};
Слайд 5

Использование класса String #include “mystring.h” #include void main( int argc, char**

Использование класса String

#include “mystring.h”
#include
void main( int argc, char** argv )

{
String arg, input;
if( argc == 2 ) {
arg.set_to( argv[1] );
printf( “Длина аргумента %d \n”, arg.length() );
}
printf( “Введите строку: \n” );
input.read( );
printf( “Длина равна %d \n”, input.length() );
}
Слайд 6

Простая реализация const int max_string_length = 128; class String { public:

Простая реализация

const int max_string_length = 128;
class String {
public:
void set_to( char*

);
int length( );
int read( ); // чтение из stdin
void print( ); // вывод в stdout
private:
// объект типа String – это последовательность из не более чем
// max_string_length символов, оканчивающаяся символом NULL
char text [ max_string_length+1 ];
};
Слайд 7

Программирование методов Синтаксис return_type class_name::function_name ( parameter_list ) { // тело

Программирование методов

Синтаксис
return_type class_name::function_name ( parameter_list )
{
// тело функции-члена класса
}
Функция-член класса

может ссылаться
на свои аргументы
на члены вызывающего объекта (не только открытые, но и закрытые свойства и методы)
с помощью ключевого слова this
по именам членов
Слайд 8

Методы класса String #include “mystring.h” #include // для стандартных строковых функций

Методы класса String

#include “mystring.h”
#include // для стандартных строковых функций
#include
int

String::length( void ) { return strlen( this->text ); }
void String::set_to( char* s ) {
strncpy( text, s, max_string_length );
(*this).text [max_string_length] = ‘\0’;
}
int String::read( void ) {
if( fgets( text, max_string_length+1, stdin ) == 0 )
return 0; // конец файла
if( text [length()-1] == ‘\n’ ) text [length()-1] = ‘\0’ ;
return 1;
}
void String::print( void ) { fputs( text, stdout ); }
Слайд 9

#include “mystring.h” #include void main( int, char** ) { String firstname,

#include “mystring.h”
#include
void main( int, char** ) {
String firstname, lastname, name;
firstname.set_to

( “Bilbo”);
lastname.set_to ( “Baggins”);
name = firstname.concat ( &lastname );
printf( “name is: ” );
name.print ( );
firstname = name.substring ( 0, 5 );
printf( “firstname is: ” );
firstname.print ( );
}

Расширение методов класса String

Слайд 10

Добавление методов для String const int max_string_length = 128; class String

Добавление методов для String

const int max_string_length = 128;
class String {
public:
void

set_to( char* );
int length( );
int read( ); // чтение из stdin
void print( ); // вывод в stdout
String substring (int start, int len);
// возвращает подстроку не изменяя оригинала
String concat ( String* );
// возвращает конкатенацию вызывающей строки // и строки-аргумента, не изменяя их самих
private:
// объект типа String – это последовательность из не более чем
// max_string_length символов, оканчивающаяся символом NULL
char text [ max_string_length+1 ];
};
Слайд 11

Функция String::substring #include “mystring.h” #include // для стандартных строковых функций #include

Функция String::substring

#include “mystring.h”
#include // для стандартных строковых функций
#include
#include

// для exit()
String String::substring ( int start, int len ) {
if( start+len >= length() || start < 0 ) {
fprintf( stderr, “illegal index (%d) for String \"%s\" \n", start, text );
exit(1);
}
String sub;
int i=0;
while (i sub.text[i] = '\0 ';
return sub;
}
Слайд 12

Функция String::concat #include “mystring.h” #include // для стандартных строковых функций #include

Функция String::concat

#include “mystring.h”
#include // для стандартных строковых функций
#include
#include

// для exit()
String String::concat ( String* s ) {
if( length()+s->length() > max_string_length ) {
fprintf( stderr, “string too large: \"%s %s\".\n", text, s->text );
exit(1);
}
String both;
strcpy( both.text, text );
strcat( both.text, s->text );
return both;
}
Слайд 13

Упражнение Запрограммируйте простейший класс Point, реализующий понятие точки, как пары координат

Упражнение

Запрограммируйте простейший класс Point, реализующий понятие точки, как пары координат
Координаты точки

можно считать целочисленными
Объявление класса разместите в файле point.h, а определение – в файле point.cpp
Ограничьтесь тремя методами, обеспечивающими нижеследующий синтаксис
Слайд 14

#include “point.h” #include int main( int, char** ) { Point p1,

#include “point.h”
#include
int main( int, char** )
{
Point p1, p2;

p1.set_to ( 3, 5 ); p2.set_to ( 2, 7 );
if ( p1.x() == 3 && p1.y() == 5 &&
p2.x() == 2 && p2.y() == 7 )
{
printf( “test successful. \n” ); return 0;
} else {
printf( “test failed. \n” ); return 1;
}
}

Напишите пользовательскую функцию print, принимающую
аргумент типа Point и печатающую значения x и y.

Слайд 15

Упражнение Запрограммируйте рассмотренный в лекции класс String Добавьте метод is_the_same_as, который

Упражнение

Запрограммируйте рассмотренный в лекции класс String
Добавьте метод is_the_same_as, который возвращает

значение TRUE (ненулевое), если вызывающий объект равен аргументу и метод is_different_from, возвращающий TRUE (ненулевое), если вызывающий объект отличается от аргумента этой функции.
Добавьте методы is_befor и is_after, которые определяют ASCII-упорядоченность строк
Протестируйте следующий синтаксис: