- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
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
}