Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Классы в C++

Автор: Уваров Андрей

Одной из основных черт C++, которой нет в С, является концепция классов. По существу, классы - самое важное понятие в C++. Классы похожи на структуры языка С. Однако структура С определяет только данные, ассоциированные с этой структурой. Вот пример структуры С:

struct CIRCLE
{
int radius;
int color;
{;

После того как вы объявили структуру, вы можете использовать ее в пределах вашей функции main (), как показано ниже:

void main() {
CIRCLE MyCircle;
...
...
MyCircle.radius = 18;
MyCircle.color = 255; // 255 задает цвет
...
...
}

Со структурой MyCircle (представляющей окружность) ассоциируются данные radius и color (радиус и цвет). Класс в C++, с другой стороны, имеет как ассоциированные с ним данные, так и функции. Данные класса называются элементами данных, а функции класса - элементами-функциями. Следовательно, в программе, которая использует классы, можно написать следующий код:

MyCircle.radius = 20;
MyCircle.color = 255;
MyCircle.DisplayCircle() ;

Первые два оператора присваивают значения элементам данных MyCircle radius и color; третий оператор вызывает функцию-элемент DisplayCircle() для вывода окружности MyCircle. MyCircle называется объектом класса circle. Ваша программа может объявить другой объект с именем HerCircle класса circle следующим образом:

CIRCLE HerCircle;

Следующие операторы присваивают значения элементам данных HerCircle radius и color:

HerCircle.radius = 30;
HerCircle.color = 0;

Затем вы можете использовать функцию-элемент DisplayCircie () для вывода окружности HerCircle:

HerCircle.DisplayCircle();

Объявление класса

Перед тем как работать с классом, ваша программа должна его объявить (так же как перед работой со структурой mystructure вы должны были объявить ее элементы данных). В данном разделе вы познакомитесь с синтаксисом объявления класса. Вы будете и дальше практиковаться с классом circle:

class Circle (
public:
Circle () ;
void SetRadius(void) ;
void GetRadius(void) ;

~Circle () ;

private:
void CalculateArea(void);
int radius;

int color;

};

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

class Circle {
...
...
Здесь вы вводите объявление класса
...
...
};

Ключевое слово class показывает компилятору, что все находящееся в фигурных скобках ({}) принадлежит объявлению класса. (Не забывайте ставить точку с запятой в конце объявления.) Объявление класса содержит объявление элементов данных (например, int radius) и прототипы функций-элементов класса. В объявлении класса circle содержатся следующие элементы данных:

int radius;
int color;

Объявление также содержит пять прототипов функций-элементов:

Circle();

void SetRadius(void) ;
void GetRadius(void) ;
~Circle () ;
void CalculateArea(void);

Первый и четвертый прототипы выглядят странно. Первый из них является прототипом функции конструктора:

Circle();

Вы узнаете о роли конструктора позже в этом разделе, а пока запомните синтаксис, который используется в C++ для прототипа функции конструктора. Когда вы записываете прототип конструктора, вы должны следовать правилам, приведенным ниже:

  • Каждое объявление класса должно включать прототип функции конструктора.
  • Имя функции конструктора должно совпадать с именем класса, а после него должны следовать круглые скобки (). Если, например, вы объявляете класс с именем Rectangle, он должен включать объявление функции конструктора класса: Rectangle (). Следовательно, объявление класса Rectangle должно выглядеть так:
class Rectangle
{
public:

Rectangle(); // Конструктор
...
...
private:
...
...
};

Не упоминайте никакого возвращаемого значения для функции конструктора. (Функция конструктора должна иметь тип void, но не нужно это указывать.)

Функция конструктора должна располагаться под ключевым словом

public.

Функция конструктора всегда возвращает значение типа void (несмотря на то, что вы не указали его в прототипе). Как вы вскоре увидите, функция конструктора обычно имеет один или большее число параметров.

Функция деструктора

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

class Circle
(
public:
...
...
~Circle (); //Деструктор private:
...
...
};

Обратите внимание на символ тильды (~), который предшествует прототипу функции деструктора. (На большинстве клавиатур вы можете найти символ тильды слева от клавиши 1.) При записи прототипа функции деструктора соблюдайте следующие правила:

Имя функции деструктора должно совпадать с именем класса и ему должен предшествовать символ ~. Если, например, вы объявляете класс с именем Rectangle, именем функции деструктора должно быть ~Rectangle. Следовательно, объявление класса Rectangle должно выглядеть следующим образом:

class Rectangle
{
public:

Rectangle(); // Конструктор
...
~Rectangle(); // Деструктор private:
...
...
};

Не указывайте никакого возвращаемого значения для функции деструктора. (Функция деструктора должна иметь тип void, но не нужно это указывать.)

Функция деструктора не имеет никаких параметров.

Ключевые слова public и private

Прототипы функций и объявления элементов данных включаются в объявлении класса в разделы public (открытый) или private (закрытый). Ключевые слова public и private говорят компилятору о доступности элементов-функций и данных. Например, функция SetRadius() определена в разделе public, и это означает, что любая функция программы может вызвать функцию SetRadius(). Функция CalculateArea() определена в разделе private, и эту функцию можно вызвать только в коде функций-элементов класса Circle

Аналогично, поскольку элемент данных radius объявлен в разделе private, прямой доступ к нему (для установки или чтения его значения) возможен только в коде функций-элементов класса Circle. Если бы вы объявили элемент данных radius в разделе public, то любая функция программы имела бы доступ (для чтения и присваивания) к элементу данных radius.

Перегруженные функции

В C++ (но не в С) вы можете использовать одно и то же имя для нескольких функций. Например, вы можете объявить две функции с именем SetRadius() в объявлении класса CCircle. Такие функции называются перегруженными функциями.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
100K
26 февраля
Blogan
0 / / 26.02.2019
Мне нравитсяМне не нравится
26 февраля 2019, 13:18:59
Хух, дошел до этой части убогого курса. Видимо автор не забыл сказать для чего вообще в С++ остались структуры с языка С и объяснить в чем разница между структурой и классом в С++. И вообще-то данные класса называются "поля", а функции класса называются "методы". Ой, автор не рассказал про функции ни черта, а тут уже и прототипы? Ммм... Как же "продвинутые" программисты просто под копирку друг в друга перенимают дурацкую привычку создавать методы-сеттеры и геттеры вот так:
void GetXXX();
void SetXXX();
Сейчас будет предложение только для продвинутых: чтобы сделать класс "универсальным" и не зависимым от платформ, нужно оперировать данными и операциями на ними непосредственно, чем связывать данные с другими объектами. То есть нужно писать вот так:
void SetXXX(Параметр); - метод принимает параметр, проверяет его корректность и меняет значение поля
Тип_Параметра GetXXX() const; - метод возвращает значение поля.
Продолжаем критику статьи...
"прототипом функции конструктора"? Конструктор - это УЖЕ функция.
"каждое объявление класса должно содержать конструктор"? С хера ли? Неявно каждый класс имеет конструктор по умолчанию, но это не значит что мы должны в объявлении его писать.
Раз начать писать за модификаторы доступа, то надо и про protected написать.
Слишком "детальное" объяснение перегруженных функций. Давай еще меньше.
Зачем нужен конструктор? Зачем нужен деструктор? Нахера ты столько вещей в эту статью вложил? Что заставило тебя вообще их загружать на сайт? Если решил "поделиться опытом", то учитель с тебя ужасный.
2.
42K
06 ноября 2008 года
Kein
3 / / 06.11.2008
+5 / -5
Мне нравитсяМне не нравится
9 июня 2010, 17:22:05
Это все конечно круто рассуждать, что передается что нет. Но на деле работает так:
push eax
push ebx
call myfunc
pop eax // вот тут мы и получаем результат
add eax,ebx
pop ebx // или до сих пор можем тянуть из стэка данные

void это значит у нас не будет значений в стэке.

Возврат как таковой вообще абстракция, на деле все происходит иначе
3.
21K
31 августа 2006 года
IamBoov
0 / / 31.08.2006
+7 / -2
Мне нравитсяМне не нравится
9 января 2009, 13:16:15
Да уж...
Не смог просто пройти мимо.

>>Не обижайтесь johncapfull. Просто начинающий прочитав ваш пост вам поверит и у него сложится неправильное мнение... Аккуратней плз.

вот прочитав ваш пост, а не пост johncapfull, начинающий точно уйдет черти куда. И действительно аккуратнее плиз.

>>Полностью согласен... Извините,johncapfull, а что вы тогда использовать будете?! А я то наивный думал что мне указатель на объект приходит.... Учим мат часть

действительно...очень наивно...
я не стану здесь расписывать назначение конструктора (а именно инициализация поля VT) просто скажу, что вы написали бред полный. имхо. Ксатати про Паскаль. Там вообще можно не иметь конструктора в классе(в плюсах всегда генерируется констурктор, если он не объявлен явно). И вопрос. С чем же там люди работают?

>>Учим мат часть
вот это как нельзя кстати подмечено. И чтобы не быть голословным. По поводу возвращаемого значения коструктором. НУ НЕ ВОЗВРАЩАЕТ ОН НИЧЕГО!
собственно мат.часть: http://msdn.microsoft.com/en-us/library/s16xw1a8.aspx
"Constructors (C++)
A member function with the same name as its class is a constructor function. Constructors cannot return values. Specifying a constructor with a return type is an error, as is taking the address of a constructor."

PS: вообще я бы порекомендовал начинающим почитать проверенную литературу, а не посты с форумов, а если и читаете то проверяйте все. Удачи.
4.
Аноним
+5 / -3
Мне нравитсяМне не нравится
25 февраля 2006, 18:58:53
Эх вы..деревья!
тип void - это тип который вообще ничего не возвращает.
5.
Аноним
+7 / -2
Мне нравитсяМне не нравится
25 декабря 2005, 03:07:44
И конструктор, и деструктор _не возвращают ничего_!

Хотя конструктор и функция, но это особая функция. Если он возвращает void, почему тогда нельзя этот тип непосредственно указать:

class MyClass {
public:
void MyClass() { ... };
// ^^^^ - не компилируется!
};

То же самое для деструктора. Shame on you all!
6.
Аноним
+2 / -5
Мне нравитсяМне не нравится
30 декабря 2004, 22:13:28
"Хочется надеяться, что это были слова человека принимавшего участие в написании хотя бы одного языка программирования.... в чем очень-очень стоит усомниться."


Полностью согласен... Извините,johncapfull, а что вы тогда использовать будете?! А я то наивный думал что мне указатель на объект приходит.... Учим мат часть

Не обижайтесь johncapfull. Просто начинающий прочитав ваш пост вам поверит и у него сложится неправильное мнение... Аккуратней плз.
7.
Аноним
+2 / -5
Мне нравитсяМне не нравится
30 декабря 2004, 22:09:38
>>Вранье, имхо. Конструктор ВООБЩЕ никакого значения не >>возвращает, даже void.

Не путайте си с паскалем. Это там в есть понятие процедуры(как и везде) и ФУНКЦИИ(процедура которая возвращает рез-т)

В си любая процедура(а конструктор это процедура) возвращает рез-т и если он явно не указан то возв. VOID. кстати деструктор тоже возвращает рез-т = VOID, просто вы это не сможете увидеть, тк объекта уже не будет
8.
Аноним
+2 / -4
Мне нравитсяМне не нравится
6 декабря 2004, 00:39:47
>>Вранье, имхо. Конструктор ВООБЩЕ никакого значения не возвращает, даже void.

Хочется надеяться, что это были слова человека принимавшего участие в написании хотя бы одного языка программирования.... в чем очень-очень стоит усомниться.
9.
Аноним
+2 / -4
Мне нравитсяМне не нравится
14 сентября 2004, 17:41:11
>> Функция конструктора всегда возвращает значение типа void...
Вранье, имхо. Конструктор ВООБЩЕ никакого значения не возвращает, даже void.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог