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

const - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
56illusion
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 37
21.11.2012, 21:51     const #1
объясните мне пожалуйста почему в конце объявления функций нужно писать const? точнее почему в данной ситуаций..

bool empty() const;

или

const int& top() const;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
21.11.2012, 21:57     const #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
const после названия функции применяется к this (не изменяет состояние класса). Проще говоря, не воздействует на него никоим образом, лишь что-то вычисляет и возвращает. Также, такое объявление позволяет функции работать с константными объектами. Во втором случае идет возвращение по константной ссылке. ну и плюс все то, что было выше.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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
1477 / 1053 / 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
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru