Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Progi / lesson 1 / Лекция / lec1.doc
Скачиваний:
36
Добавлен:
28.03.2015
Размер:
88.58 Кб
Скачать

visual studio c++ нач. 2010

java jdk, netbeans, нач. с 2010

visual studio c# нач. с 2010

Qt нач. с 5.0

Переход от структур Си (struct) к классам C++

1) Запись структур в стиле C++

Пример структуры на Си.

Запись результата спортсмена по бегу (4 мин. 26 сек.) в виде структуры.

В стандарте Си структуры объявляются следующим образом:

typedef struct

{

int min;

int sec;

} Record;

int main(int argc, char* argv[])

{

Record a; // переменная a типа Record

a.min=4;

a.sec=26;

return 0;

}

На языке C++ структуры обычно записываются следующим образом:

struct Record

{

int min;

int sec;

}; // Внимание! Не забывать ставить точку с запятой

Int main(int argc, char* argv[])

{

Record a; // переменная a типа Record

a.min=4;

a.sec=26;

return 0;

}

Далее используем синтаксис C++

2) Замена структуры struct на класс class

При простой замене возникает ошибка

class Record

{

int min;

int sec;

};

Int main(int argc, char* argv[])

{

Record a; // переменная a типа Record

a.min=4; // здесь ошибка

a.sec=26; // здесь ошибка

return 0;

}

[C++ Error] Unit1.cpp(17): E2247 'Record::min' is not accessible (min недостуна)

Объяснение ошибки далее.

Правильный вариант использования class

class Record

{

public:

int min;

int sec;

};

Int main(int argc, char* argv[])

{

Record a; // переменная a типа Record

a.min=4;

a.sec=26;

return 0;

}

Используем class и указываем public:

Это единственное небольшое различие между struct и class

3) Добавление методов в классы.

Кроме обычных переменных в классах (или структурах C++) могут быть функции и переменные типа такого класса в main могут вызывать эти функции.

Для структуры Record добавим функцию, вычисляющую общее число секунд: 60*min+sec

class Record

{

public:

int min;

int sec;

int Numbersec(); // функция внутри Record возвращает int не имеет аргументов,

// работает с полями, здесь только заголовок

};

int Record::Numbersec() // Record:: - функция Numbersec

// принадлежит классу Record

{

return min*60+sec; // работает с переменными внутри Record

}

Int main(int argc, char* argv[])

{

Record a,b; // переменные типа Record

int k,m; // обычные целые

// задание значений min,sec переменным a,b

a.min=4;

a.sec=26;

b.min=1;

b.sec=6;

// переменная a вызывает функцию, работающую со значениями

// переменных min,sec у a результат присваивается k

k=a.Numbersec(); // k=4*60+26=266

// переменная b аналогично вызывает Numbersec

m=b.Numbersec(); // m=1*60+6=66

return 0;

}

Терминология:

Переменные (или массивы) в классе (min,sec в Record) называются полями класса

Функции в классе (Numbersec) называются методами класса

Переменные типа класса (Record a,b;) называются объектами класса.

Пример с массивом объектов:

Int main(int argc, char* argv[])

{

Record c[5];

int i,s;

for (i=0;i<5;i++)

{

c[i].min=1; // У всех 5 элементов min=1

c[i].sec=i; // c[0].sec=0 c[1].sec=1 ….

}

s=0;

for(i=0; i<5; i++)

{

s=s+c[i].Numbersec(); // s= 60+61+…

}

Пример класса с полем в виде массива:

class Sportsman

{

public:

char Fam[30]; // фамилия

…….

};

…….

Int main(int argc, char* argv[])

{

Sportsman a;

strcpy(a.Fam,”Иванов”);

a.Fam[0]=’и’;

………………..

}

4) Инкапсуляция (ограничение доступа) public: и private:

Если поля и методы находятся после public: их можно использовать где угодно, если после private: только внутри методов класса.

Добавим к Record метод округления до минут (если секунд больше 30 минуты

увеличить на 1 ).

class Record

{

public:

int min;

int Numbersec(); // количество секунд

private:

int Roundmin(); // округление до минуты

int sec;

};

// min, Numbersec() - public

// sec, Roundmin() - private

int Record::Numbersec()

{

return min*60+sec; // ошибки нет метод класса имеет доступ ко всем полям и методам

}

int Record::Roundmin()

{

int k; // локальная переменная

if(sec>30) // ошибки нет private Roundsec может обращаться ко всем полям и методам

k=1;

else

k=0;

return min+k; // ошибки нет Roundsec обращается к public min

}

Соседние файлы в папке Лекция