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

Константные аргументы функции

25.03.2020, 22:46. Показов 6402. Ответов 17

Студворк — интернет-сервис помощи студентам
Посмотрел видео SimpleCode Константные аргументы функции. Там он объясняет зачем нужны константные аргументы функции и всё. Вот его код. Появился вопрос. Чем отличаются const int A, int const A, const int const A друг от друга в параметрах ?
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
#include<iostream>
using namespace std;
void fill(int* const a,const int n) {
    for (int i = 0; i < n; i++) 
    {
        a[i] = rand() % 10;
    }
}
void print(const int* const a, const int n) {
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}
int main() {
    int n;
    cin >> n;
    int* a = new int[n];
    fill(a, n);
    print(a, n);
    delete[]a;
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.03.2020, 22:46
Ответы с готовыми решениями:

Константные аргументы классов
Добрый вечер! Поясните мне в чем беда.. есть код: // Hanoian towers. Lab2 #include &lt;iostream&gt; using namespace std; ...

Что такое константные аргументы и процесс линковки программы?
Помогите ответить на вопросы которые в заголовке)

Константные и не константные ссылки. Приведения типов. Нужно уточнение
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &amp;y = x; const double &amp;y = x; Почему для не...

17
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.03.2020, 23:24
Лучший ответ Сообщение было отмечено Inter_106 как решение

Решение

Цитата Сообщение от Inter_106 Посмотреть сообщение
Чем отличаются const int A, int const A, const int const A друг от друга в параметрах ?
Звездочку забыл:
const int * const A - константный указатель на константу
int const * A - не константный указатель на константу
const int * A - не константный указатель на константу
const int A, int const A - с типами не указателями нет разницы
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
25.03.2020, 23:26
Лучший ответ Сообщение было отмечено Inter_106 как решение

Решение

C++
1
const int* const a
Первый квалификатор const указывает на константность тип данных в памяти, на который указывает указатель - неизменяемое целое число.
То есть, сделать *a = 0 не выйдет. Содержимое памяти по указателю константно.
(Замечу, const int и
C++
1
int const
- одно и то же).

Лексемма * указывает на то, что тип переменной - указатель.

Ключевое слово const перед именем переменной указывает что сама переменная неизменяемый указатель.
То есть, сделать a = &b не получится. а - константа.

Цитата Сообщение от Inter_106 Посмотреть сообщение
ем отличаются const int A, int const A, const int const A друг от друга в параметрах ?
const int A от int const A ничем не отличаются.
На const int const A компилятор даст ворнинг, что квалификатор const применен дважды к одному типу.
int* const a константная ссылка на неконстантные значения. Можно менять память по указателю *a = 0, но нельзя поменять содержимое самой переменной a = b не скомпилируется.
const int* const a - и содержимое памяти и указатель нельзя менять.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
25.03.2020, 23:38
Цитата Сообщение от lemegeton Посмотреть сообщение
На const int const A компилятор даст ворнинг, что квалификатор const применен дважды к одному типу.
В С++ запрещается явно повторять квалификаторы в объявлении. Поэтому не ясно, что имеется в виду под "компилятор даст ворнинг".
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.03.2020, 23:59
Лучший ответ Сообщение было отмечено Inter_106 как решение

Решение

C++
1
2
3
4
5
void f(const int * const ptr){
    //(*ptr)++;    //нельзя менять значение, вытаскиваемое через указатель
   // ptr = nullptr;  //нельзя смещать сам указатель
//константный указатель на константное значение
}
C++
1
2
3
4
5
void f(int * const ptr){
    (*ptr)++;    //можно менять значение, вытаскиваемое через указатель
    //ptr = nullptr;  //нельзя смещать сам указатель
//константный указатель на неконстантное значение
}
C++
1
2
3
4
5
void f(const int * ptr){
   // (*ptr)++;    //нельзя менять значение, вытаскиваемое через указатель
    ptr = nullptr;  //можно смещать сам указатель
//неконстантный указатель на константное значение
}
Добавлено через 9 минут
Разница между
C++
1
2
void f(const int a){}
void f(int const a){}
Только в том, что чтение справа-налево становится удобное: во втором случае легко читается как "а — это константный int". В аспектах непосредственной работы в программе эти записи полностью идентичны.

Добавлено через 6 минут
Это лучше понятно вот так:
C++
1
2
3
4
5
template <typename T>
void f1(const T a){}
 
template <typename T>
void f2(T const a){}  //здесь легче прочитать, что а — константа типа Т
0
0 / 0 / 0
Регистрация: 04.10.2019
Сообщений: 66
26.03.2020, 00:09  [ТС]
Цитата Сообщение от daslex Посмотреть сообщение
Это лучше понятно вот так:
Большое спасибо. Благодаря вашему комменту полностью разобрался в теме
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
26.03.2020, 00:57
Цитата Сообщение от daslex Посмотреть сообщение
Только в том, что чтение справа-налево становится удобное
Чтение справа-налево может и становится удобнее, но тонкости синтаксиса и семантики конструкции скрываются. В С и С++ const непосредственно на типе принципиально отличается от const более высокого уровня индирекции. Отличается тем, что const на типе относится глобально ко всему объявлению, а const более высокого уровня относится только к одному отдельному декларатору.

Здесь может быть не ясно, является ли b константой или не является:

C++
1
int const *a = 0, b = 42;
Здесь может быть не ясно, на какой тип указывает d:

C++
1
int const *c = 0, *d = 0;
А вот здесь подчеркивается тот факт, что const относится ко всему объявлению, т.е. и к a, и к b, и к c, и к d

C++
1
2
const int *a = 0, b = 42;
const int *c = 0, *d = 0;
Именно поэтому предпочтительнее этот особенный const на типе все таки писать в самом начале объявления.
2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
26.03.2020, 01:03
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В С++ запрещается явно повторять квалификаторы в объявлении. Поэтому не ясно, что имеется в виду под "компилятор даст ворнинг".
Никогда не проверял, поэтому подсмотрел в VS17.
C++
1
const int const a = 0;
Warning C4114 - same type qualifier used more than once
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
26.03.2020, 01:22

Не по теме:

TheCalligrapher, я думал, что как предпочтительнее решает "style-code — группа".



Добавлено через 1 минуту

Не по теме:

Да и вопрос, в целом, относился к параметрам функций.



Добавлено через 1 минуту

Не по теме:

Это не отменяет полезности сообщения, конечно.

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
26.03.2020, 01:39
Цитата Сообщение от lemegeton Посмотреть сообщение
Никогда не проверял, поэтому подсмотрел в VS17
Это никак не отменяет того факта, что в языке С++ это запрещено. А какое слово компилятор использовал в диагностическом сообщении - ворнинг или гладиолус - роли не играет.

Это не говоря уже о том, что "warning" в VS2017 рапортуется только в режиме разрешенных Microsoft extensions.

Цитата Сообщение от daslex Посмотреть сообщение
Да и вопрос, в целом, относился к параметрам функций.
Зачем плодить какие-то отдельные вариации правил для объявлений в параметрах функций и для объявлений вне параметров функций? Это только усилит путаницу.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.03.2020, 02:12
Цитата Сообщение от Inter_106 Посмотреть сообщение
Чем отличаются const int A
можно ещё добавить,
что квалификатор const игнорируется для параметров функции по значению.

вот эти два объявления абсолютно эквивалентны:

C++
1
void foo(const int);
и
C++
1
void foo(int);
типы этих функций одинаковые:

C++
1
2
3
4
5
6
using f1 = void(const int);
using f2 = void(int);
static_assert(
    std::is_same<f1,f2>::value,
    "f1 same f2"
);
можно объявить функцию без const, а определить с const (и наоборот):

C++
1
2
void foo(int);
void foo(const int) { std::cout << "hello\n"; }
единственное на что влияет const для параметров по значению:
если его указать в определении функции,
то компилятор проконтролирует,
что копия аргумента внутри функции не изменится.

C++
1
2
3
void foo(const int v) {
    v = 10; // error нельзя изменить константу
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
26.03.2020, 03:29
Цитата Сообщение от hoggy Посмотреть сообщение
что квалификатор const игнорируется для параметров функции по значению.
Цитата Сообщение от hoggy Посмотреть сообщение
единственное на что влияет const для параметров по значению:
если его указать в определении функции,
то компилятор проконтролирует,
что копия аргумента внутри функции не изменится.
То есть все таки не "игнорируется", а лишь "не влияет на тип функции, но влияет на тип параметра внутри функции". Это не одно и то же.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
26.03.2020, 05:22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Именно поэтому предпочтительнее этот особенный const на типе все таки писать в самом начале объявления.
Именно по это предпочтительней писать каждый declaration statement в отдельной строке.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
26.03.2020, 09:04
Чтобы const int что-то подчёркивал, нужно, чтобы читающий код уже знал, что это что-то подчёркивает. В более простом случае это неочевидно.

Рекомендацию писать const для каждого объекта или каждой переменной отдельно можно встречать в учебниках (вероятность высокая), а что для одного квалификатора const нужно писать много переменных и/или объектов — встретить, скорее всего, невозможно (вероятность крайне низкая), наоборот, это должно критиковаться. Никакой путаницы в таком раскладе не будет.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
26.03.2020, 09:47
Цитата Сообщение от daslex Посмотреть сообщение
Рекомендацию писать const для каждого объекта или каждой переменной отдельно можно встречать в учебниках (вероятность высокая), а что для одного квалификатора const нужно писать много переменных и/или объектов — встретить, скорее всего, невозможно (вероятность крайне низкая), наоборот, это должно критиковаться. Никакой путаницы в таком раскладе не будет.
Во-первых, использовать ли несколько деклараторов в одном объявлении - это вопрос стиля. Как правило за стиль "одно объявление - один декларатор" борются в основном любители выравнивать символы * и & влево в объявлениях. Это их право, но я такого стиля не придерживаюсь.

Во-вторых, стиль "одно объявление - один декларатор" приводит к множественному повторению одного и того же имени типа при необходимости сделать несколько объявлений. Это совершенно не приемлемо. Имена конкретных типов в программе должны упоминаться настолько редко, насколько это возможно. Указывать имена типов несколько раз, да еще и в ситуации, когда они должны быть заведомо одинаковыми - это плохо.

Современное auto несколько помогает решить эту проблему, устраняя необходимость указывать конкретные имена типов, но как раз тут и начинают блистать объявления с множественными деклараторами: такие объявления гарантируют, что для всех объектов, которые должны иметь один и тот же тип, будет действительно дедуцирован один и тот же тип. А вот в множественных отдельных объявлениях возможны неприятные сюрпризы с дедукцией типов.

В-третьих, многие такие учебники предназначены для студентов-первокурсников, для того, что сформировать у них правильные приоритеты. Учебники для студентов-второкурсников начинаются словами "забудьте всю ту чушь, которую вам втирали учебники в прошлом году".
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
26.03.2020, 10:05
Я не хочу спорить, расклад может быть только или или: или есть "code-style" требование, или каждый пишет, как ему больше нравится.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.03.2020, 10:44
Цитата Сообщение от daslex Посмотреть сообщение
Я не хочу спорить, расклад может быть только или или: или есть "code-style" требование, или каждый пишет, как ему больше нравится.
Не всегда можно нормально объявить переменные в отдельных инструкциях.
C++
1
for(int const * begin = ..., * end = ...; ...)//или if, или еще чего - не суть
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.03.2020, 11:13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
да еще и в ситуации, когда они должны быть заведомо одинаковыми - это плохо.
очевидно жеж: заведомо плох нечитабельный говнокод.
это - главная причина, почему во всем цивилизованном мире запрещено однострочное уг.

а вообще, твоё сообщение отдаёт чем то регилиозным.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во-вторых, стиль "одно объявление - один декларатор" приводит к множественному повторению одного и того же имени типа при необходимости сделать несколько объявлений. Это совершенно не приемлемо.
почему?

любые тезисы в духе: "это не правильно",
без объяснения причин, просто потому, что кто-то когда-то почему-то так решил - вкусовщина религиозного ума.

я могу возразить:
можно сколько угодно повторять что угодно, если это делает код более простым и понятным.
простой и понятный код всегда лучше не простого, и не понятного.

однострочники делают код более сложным и менее понятным.
именно по этой причине однострочники запрещены (или не рекомендуются) во всех цивилизованных регламентах стиля
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2020, 11:13
Помогаю со студенческими работами здесь

Константные функции
Почему все работает? class My { public: My(); int retFunc() const; private: bool isRet = false; };

Константные функции-члены
можно ли функцию-член объявить константной, если она возвращает указатель-член класса? Ведь она не изменяет занчение самого укзателя, но...

Константные функции-члены ?
Для чего использовать #define ? не имеют права изменять поля класса почему ? class Array { ... inline double operator...

Константные функции-члены класса, возвращающие ссылку на константу
Упражняюсь по книге Липпмана, выполняю задания по теме классы. Необходимо реализовать класс person, который способен хранить имя и адрес...

Аргументы функции: что значит "большие" и "небольшие" аргументы?
Здравствуйте! Всем доброго дня! Растолкуйте пожалуйста! Что значит большие и небольшие?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru