Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
56illusion
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 37
#1

const - C++

21.11.2012, 21:51. Просмотров 1439. Ответов 4
Метки нет (Все метки)

объясните мне пожалуйста почему в конце объявления функций нужно писать const? точнее почему в данной ситуаций..

bool empty() const;

или

const int& top() const;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 21:51     const
Посмотрите здесь:

Разница между объявлениями const Person p1 и Person const p1 - C++
Всем привет. Собственно весь вопрос уместился в заголовок: в чем разница между объявлениями const Person p1 и Person const p1, если...

Int* const или const int*? - C++
class A { public: A() : x(777) {} int* const GetX() { return &x; }

const function - C++
Здравствуйте, совсем забыл не напомните, что меняется в функции в зависимости от расположения const: Например: const int const...

static и const - C++
static void A(); Что дает этот статик? Что он вообще дает? int A() const; Что дает конст в данном случае? static int...

Const #define - C++
{ const int HOLFSDsize= 2;//#define HOLFSDsize 2 // m-угольник void HOLFSD() { int i, n, l; // объявляем...

Защита const - C++
const Int& operator= (const Int& a) Отчего защищает первый const

const double * - C++
Доброго всем времени суток. Подскажите, в записи double my_func(const double *A); Константным будет указатель или массив?

const volatile - C++
Пример из Шилдт Г. "С++ Базовый курс (3-е издание, 2010)" стр 205 const volatile unsigned char *port = (const volatile char *)...

static const? - C++
если мне нужна константа в классе, как ее лучше объявить со static или без? разница будет только в том, что со статиком мне можно будет...

static const - C++
объясните, пожалуйста, вот такую странную конструкцию (накопал в старой проге): после #include идет следующее: static const char...

const in OOP - C++
Я абсолютно не понимаю зачем нужно const. Изменяет эта функция дату или не изменяет какая разница у нас же есть разный уровень доступа...

'const char* ...' does not much 'const char*' ??? - C++
Доброе время суток, товарищи! Застрял на ошибке: " error: argument of type ‘const char* (person::)()’ does not match ‘const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Модератор
Эксперт CЭксперт С++
6997 / 4168 / 594
Регистрация: 29.11.2010
Сообщений: 11,047
21.11.2012, 21:57     const #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
const после названия функции применяется к this (не изменяет состояние класса). Проще говоря, не воздействует на него никоим образом, лишь что-то вычисляет и возвращает. Также, такое объявление позволяет функции работать с константными объектами. Во втором случае идет возвращение по константной ссылке. ну и плюс все то, что было выше.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,909
21.11.2012, 23:09     const #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Чтобы вам было понятно: представьте, что каждому методу класса, при вызове, в качестве неявного параметра передаётся указатель на объект, который этот метод вызывает, т.е.
C++
1
2
3
4
class SomeClass {
public:
    bool empty();
};
для компилятора выглядит как
C++
1
2
3
4
class SomeClass {
public:
    bool empty(SomeClass* this); 
};
C++
1
2
SomeClass sc;
if(sc.empty()) ... // для компилятора if(empty(&sc));
Указывая в конце метода const мы делаем этот неявный параметр константным
C++
1
bool empty() const; // для компилятора bool empty(const SomeClass* this)
Поэтому же принципу методы можно перегружать, различая какие методы будут вызываться для неконстантных объектов, а какие для константных. Общее правило таково:
eсли метод не должен менять значения полей своего класса, пишем const;
если метод может менять значения полей своего класса, const НЕ пишем;
если необходимо назначить различное поведение метода для константных и неконстантных объектов перегружаем его по const:
C++
1
2
void f(); // версия для неконстантных объектов
void f() const; // версия для константных объектов
56illusion
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 37
21.11.2012, 23:23  [ТС]     const #4
спасибо огромное !! долго не имел понятия..
на курсе по Data Structures проходили Stack. написал с помощью книги ( data structures & algorithmes in c++)
шаблон для Stack. в примере с книги и наткнулся на эти const.

и последний вопрос, когда вывожу cout << S.top() << endl;
нужно ли перегружать оператор << ?? потому что в книги его не перегружали, а у меня компилятор выдает ошибки..
связяно ли ето с етой трокой ?

Stack.h
--------------
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdlib.h>
using namespace std;
 
template <typename E>
class ArrayStack
{
    enum { DEFAULT_CAPACITY = 100 };
public:
    ArrayStack(int _capacity = DEFAULT_CAPACITY); // default stack capacity
    ~ArrayStack();
    int size() const;                             // number of items in the stack
    bool empty() const;                           // is the stack empty?
    const E& top() const throw(StackEmpty);       // get the top element
    void push(const E& e) throw(StackFull);       // push element 
    void pop() throw(StackEmpty);                 // pop element
 
private:
    E* S;            // array of stack elements
    int capacity;    // stack capacity
    int topIndex;    // index of the top of the stack
};
Stack.cpp
-------------------
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "Stack.h"
 
template <typename E> ArrayStack<E>::ArrayStack(int _capacity)
{
    this->S = new E(_capacity);
    this->capacity = _capacity;
    this->topIndex = -1;
} // constructor
 
template <typename E> int ArrayStack<E>::size() const 
{ return (this->topIndex + 1); } // get number of items in the stack
 
template <typename E> bool ArrayStack<E>::empty() //const
{ return (this->topIndex < 0); } // is the stack empty
 
template <typename E> const E& ArrayStack<E>::top() const throw(StackEmpty)
{
    if(empty()) throw StackEmpty("Top of empty stack");
    return (S[topIndex]);
} // get top value
 
template <typename E> void ArrayStack<E>::push(const E& e) throw(StackFull)
{
    if(size() == capacity) throw StackFull("Push to full stack");
    S[++topIndex] = e;
} // push tu stack
 
template <typename E> void ArrayStack<E>::pop() throw(StackEmpty)
{
    if(empty()) throw StackEmpty("Pop from empty stack");
    --topIndex;
}
test.cpp
---------------
C++
1
2
3
4
5
6
7
void main()
{
    ArrayStack<int> S;
    S.push(7);
    S.push(15);
    cout << S.top() << endl; S.pop();
}
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.11.2012, 23:32     const #5
надо или не надо - зависит от того, какой тип возвращает функция top.
если какой-нибудь стандартный тип вроде int - то не надо, если же свой тип вроде MyClass, то конечно
же для этого MyClass должена быть перегрузка оператора <<
C++
1
2
3
4
5
6
7
 ArrayStack<int> intS;
 ArrayStack<MyClass> myClassS;
 
...
 
 std::cout << intS.top(); // ok. top() возвращает int
 std::cout << myClassS.top(); // ошибка, если для MyClass не перегружен оператор << (top() возвращает ссылку на MyClass)
Yandex
Объявления
21.11.2012, 23:32     const
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru