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

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

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

const - C++

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

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

bool empty() const;

или

const int& top() const;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 21:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const (C++):

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start->next;} return c; } Функция...

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //<-- ??? } В clang это работает. В VisualStudio 2015 нет.

4
MrGluck
Модератор
Эксперт CЭксперт С++
7418 / 4533 / 673
Регистрация: 29.11.2010
Сообщений: 12,287
21.11.2012, 21:57 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
const после названия функции применяется к this (не изменяет состояние класса). Проще говоря, не воздействует на него никоим образом, лишь что-то вычисляет и возвращает. Также, такое объявление позволяет функции работать с константными объектами. Во втором случае идет возвращение по константной ссылке. ну и плюс все то, что было выше.
3
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
21.11.2012, 23:09 #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; // версия для константных объектов
3
56illusion
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 37
21.11.2012, 23:23  [ТС] #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();
}
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.11.2012, 23:32 #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)
1
21.11.2012, 23:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 23:32
Привет! Вот еще темы с ответами:

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,&quot;acc.dll&quot;,RT_RCDATA); if(!hRes){ } HGLOBAL...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...

error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+' - C++
Что означает ошибка в 8 строчке error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'? ...

Чем отличаются выражения (const int[]){value} от (const int[]){100} - C++
(const int){22} //Приведение к массиву и инициализация его значениями 22 от (const int){i} //Приведение к массиву и инициализация его...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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