Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 37

const

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

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

bool empty() const;

или

const int& top() const;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2012, 21:51
Ответы с готовыми решениями:

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

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

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

4
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.11.2012, 21:57
Лучший ответ Сообщение было отмечено как решение

Решение

const после названия функции применяется к this (не изменяет состояние класса). Проще говоря, не воздействует на него никоим образом, лишь что-то вычисляет и возвращает. Также, такое объявление позволяет функции работать с константными объектами. Во втором случае идет возвращение по константной ссылке. ну и плюс все то, что было выше.
3
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
21.11.2012, 23:09
Лучший ответ Сообщение было отмечено как решение

Решение

Чтобы вам было понятно: представьте, что каждому методу класса, при вызове, в качестве неявного параметра передаётся указатель на объект, который этот метод вызывает, т.е.
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
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 37
21.11.2012, 23:23  [ТС]
спасибо огромное !! долго не имел понятия..
на курсе по 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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.11.2012, 23:32
надо или не надо - зависит от того, какой тип возвращает функция 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2012, 23:32
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru