Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2

Про const

13.01.2023, 15:13. Показов 3219. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
int getAge() const {return mAge;}
const что даст аднака? спс
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2023, 15:13
Ответы с готовыми решениями:

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

Ошибка про const char
Есть такой код: void ShowDeviceList(void) { char Error; pcap_if_t* Devices; pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL,...

Пояснить про const в возвращаемом типе функции
когда может понадобится написать такое: const int func(int i) { return i+5; } вопрос конкретно за const

35
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
14.01.2023, 23:24
Студворк — интернет-сервис помощи студентам
zayats80888, не прочитали что ли
экземпляр класса это не более чем распределённые в памяти нестатические данные класса, а вот методы класса лежат в памяти отдельно
вы обратились к нестатическим данным класса
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.01.2023, 23:34
Цитата Сообщение от abit Посмотреть сообщение
вы обратились к нестатическим данным класса
Во-первых, не вижу в вашей цитате логики.
Во-вторых там "проверка" есть.
А с clang почему тогда не падает?
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
14.01.2023, 23:40
ещё раз, вы можете вызывать методы класса, не создавая объект и это нормально, никакой стандарт это не запрещает, так работают конструкторы, методы лежат отдельно от бинарного представления конкретных объектов, методы хранятся в одном экземпляре для всех объектов класса (даже в случае virtual), если у вас есть нестатические поля объекта, то к ним нельзя обращаться из методов несозданных объектов, к методам несозданных объектов - никто не запрещает

Добавлено через 2 минуты
вот нашёл по теме статью
http://knzsoft.blogspot.com/se... 0%9E%D0%9F
1
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.01.2023, 23:46
Цитата Сообщение от abit Посмотреть сообщение
ещё раз, вы можете вызывать методы класса, не создавая объект и это нормально, никакой стандарт это не запрещает,
->
Цитата Сообщение от abit Посмотреть сообщение
если у вас есть нестатические поля объекта, то к ним нельзя обращаться из методов несозданных объектов
Не понял, так нормально или запрещено? Кем запрещено и что будет, если обращусь? И что такое "несозданный объект"?

Не по теме:

Я не хочу троллить и знаю, как в некоторых компиляторах реализована объектная модель, однако, как уже сказали, это UB.
Приведенный пример демонстрирует различное поведение компиляторов в рамках своей объектной модели. Если подумаете, то поймете, почему gcc проигнорировал проверку на nullptr в функции bar

0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.01.2023, 23:49
Цитата Сообщение от abit Посмотреть сообщение
никакой стандарт это не запрещает, так работают конструкторы
А ? И как же конструктор из NULL будет инициализировать переменные класса ?
По всей видимости конструкторы работают не так
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
14.01.2023, 23:55
Цитата Сообщение от SmallEvil Посмотреть сообщение
И как же конструктор из NULL будет инициализировать переменные класса ?
очевидно конструктору не нужно инициализировать что-то в null, я к тому, что он вызывается в несозданном объекте как метод, дальше он уже делает memalloc и инициализирует объект
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,345
15.01.2023, 00:13
Цитата Сообщение от abit Посмотреть сообщение
конкретно где?
Именно для вызова метода:

7.6.1.5 Class member access[expr.ref] требует, чтобы левая часть выражения E1.E2 была glvalue. glvalue оп определению - это выражение, идетифицирующее объект или функцию. Разыменование нулевого указателя не идентифицирует никакой объект. Это нарушает требования 7.6.1.5. Поведение не определено.

Но на самом деле проблема проявляется еще раньше: разыменование нулевого указателя. Попытки "легализовать" разыменование нулевых указателей в С++ были
https://www.open-std.org/jtc1/... e.html#232
с введением понятия "пустого lvalue" и т.п. Но все это закончилось ничем. Тема была оставлена в покое более десяти лет назад. По-прежнему стандарт языка использует разыменование нулевых указателей как пример неопределенного поведения
http://eel.is/c++draft/dcl.ref#note-2

Цитата Сообщение от abit Посмотреть сообщение
ещё раз, вы можете вызывать методы класса, не создавая объект и это нормально, никакой стандарт это не запрещает, так работают конструкторы, методы лежат отдельно от бинарного представления конкретных объектов, методы хранятся в одном экземпляре для всех объектов класса (даже в случае virtual), если у вас есть нестатические поля объекта, то к ним нельзя обращаться из методов несозданных объектов, к методам несозданных объектов - никто не запрещает
Это пионэрское верование мы тут уже 100500 раз разбирали.

Еще раз: в языке С++ применение оператора -> к нулевому указателю - сразу неопределенное поведение.

Цитата Сообщение от abit Посмотреть сообщение
вот нашёл по теме статью
Смешно...

Добавлено через 31 секунду
Цитата Сообщение от abit Посмотреть сообщение
я к тому, что он вызывается в несозданном объекте как метод, дальше он уже делает memalloc и инициализирует объект
Чего? memalloc? Какой еще memalloc? Зачем? О чем речь вообще?
4
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
15.01.2023, 00:14
7.6.1.5 Class member access[expr.ref] требует, чтобы левая часть выражения E1.E2 была glvalue. glvalue оп определению - это выражение, идетифицирующее объект или функцию. Разыменование нулевого указателя не идентифицирует никакой объект. Это нарушает требования 7.6.1.5. Поведение не определено.
убедительно!
но от разыменования мы можем легко уйти:

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
#include <iostream>
#include <vector>
 
struct A 
{
int& f(std::vector<int> &array, size_t index) const
{
  return array[index];
}
 
const int& g(std::vector<int> &array, size_t index) const
{
  return array[index];
}
};
 
int main()
 
{
 
    std::vector<int> array = {1,2,3,4,5};
    A a;
    a.f(array, 2) = 10;                   // элементу array[2] присвоили значение 10
    std::cout << array[2] << '\n';      // это корректно!
    
    a.g(array, 2) = 10;                  // а тут ошибка, const объект не может быть lvalue
    
    return 0;
 
}
суть то вопроса про const, a.f(array, 2) = 10; выполняется a.g(array, 2) = 10; нет
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
15.01.2023, 00:23
Цитата Сообщение от abit Посмотреть сообщение
а тут ошибка, const объект не может быть lvalue
Ошибка тут будет скорее присваивание константе значения.

Об этом и компиляторы говорят:
GCC
Code
1
error: assignment of read-only location 'a.A::g(array, ((size_t)2))'
CLang
Code
1
error: cannot assign to return value because function 'g' returns a const value
Добавлено через 1 минуту
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
#include <iostream>
#include <vector>
 
struct A
{
    int& f(std::vector<int> &array, size_t index) const
    {
        return array[index];
    }
 
    const int& g(std::vector<int> &array, size_t index) const
    {
        return array[index];
    }
};
 
int main()
 
{
 
    std::vector<int> array = {1,2,3,4,5};
    A a;
    a.f(array, 2) = 10;                   // элементу array[2] присвоили значение 10
    std::cout << array[2] << '\n';      // это корректно!
 
    const int &ref = a.g(array, 2); // lvalue такое lvalue
    const_cast<int&>(ref) = 10; // хоба -- присвоил
 
    return 0;
 
}
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
15.01.2023, 00:26
какие const_cast, это читерство, человек спросил
int getAge() const {return mAge;}
const int getAge() const {return mAge;}
выражения идентичны?
я ответил, что нет, нашёл пример как они отличаются и тут понеслось
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
15.01.2023, 00:33
Цитата Сообщение от abit Посмотреть сообщение
нашёл пример
Ваше пояснение к примеру могло бы быть несколько более корректным относительно стандарта.

Цитата Сообщение от abit Посмотреть сообщение
и тут понеслось
Вы столько лет на форуме, прекрасно, должно быть, знаете, что местные педанты-перфекционисты из космоса не могут спокойно пойти спать, пока кто-то в этих ваших интернетах не правильно толкует понятия из стандарта.

Коли уж ваш пост заметили.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,345
15.01.2023, 00:57
Цитата Сообщение от lemegeton Посмотреть сообщение
Ошибка тут будет скорее присваивание константе значения.
Ошибка будет в том, что что встроенный оператор присваивание требует модифицируемое lvalue в левой части.

В данном случае результат вызова функции является lvalue (lvalue-ссылка по определению всегда является lvalue, без вариантов), но при этом результат вызова функции не является модифицируемым lvalue.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.01.2023, 01:41
Цитата Сообщение от abit Посмотреть сообщение
((A*)(NULL))->f
UB.

Добавлено через 18 минут
Цитата Сообщение от abit Посмотреть сообщение
const объект не может быть lvalue
ещё как может.
самая обыкновенная переменная в выражениях является lvalue

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template<class t>
std::enable_if_t< std::is_lvalue_reference_v<t&&> > foo(t &&)
  { std::cout << "lvalue\n"; }
 
template<class t>
std::enable_if_t< std::is_rvalue_reference_v<t&&> > foo(t &&)
  { std::cout << "rvalue\n"; }
 
int main()
{
    int a;
    const int b = 1;
    foo(a);  // аргумент lvalue
    foo(b);  // аргумент lvalue
    foo(1);  // аргумент rvalue
}
может быть так тебе будет проще понять:
lvalue - все те выражения, которые не rvalue
а rvalue - это либо временные объекты (prvalue),
либо объекты, которые делают вид, что они временные (xvalue)

примеры:

C++
1
2
3
4
int a = 1;
foo(a); // <--- аргумент lvalue (обычная переменная)
foo(1); // <--- аргумент rvalue (временный объект)
foo(std::move(a)); // <--- аргумент xvalue (делаем вид, будто бы переменная - временный объект)
Добавлено через 6 минут
Цитата Сообщение от abit Посмотреть сообщение
const int f(x)
говорит что вы возвращаете константный объект, а
нет, не говорит.

см #5
1
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,884
15.01.2023, 01:52
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
const объект может быть lvalue.
а, понял) я не тот термин использовал

Добавлено через 5 минут
hoggy
а где я могу увидеть ваши примеры отличия const T f() const от T f() const, напомните
0
 Аватар для ram876
759 / 456 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
15.01.2023, 11:47
Вот мой пример для const, может поможет в понимании:
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
33
34
#include <iostream>
struct st
{
    int a;
    st(const int b):a(b){}
    const int & foo(int & c)
    {
        return c;
    }
    int & foo(int & c) const
    {
        return c;
    }
};
void print(const int & a)
{
    std::cout << a << " - Const\n";
}
void print(int & a)
{
    a--;
    std::cout << a << " - No Const\n";
}
 
int main()
{
    st obj1(5);
    const st obj2(10);
    int num = 20;
    print(obj1.foo(num));
    print(obj2.foo(num));
    
    return 0;
}
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
15.01.2023, 12:35  [ТС]
всем спасибо, кое что я понял таки), продолжение следует
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2023, 12:35

Про override для const параметров в VS2017
Имеется некий класс. К примеру BaseReader у него есть чисто виртуальный метод virtual std::vector&lt;bool&gt; readCoils(const...

Вопрпос про const: в какой области памяти они находятся, и где это объявлять ?
Приветствую. У меня вот такая задача - завести массив констант, причём он используется ТОЛЬКО одной функцией (не main), и поэтому,...

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

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

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru