Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
1

Изменяется ли адрес или значение переменной при объявлении ее как const?

27.08.2015, 14:06. Показов 2359. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При объявлении const у нас значение переменной или адрес переменной не изменяется?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2015, 14:06
Ответы с готовыми решениями:

Можно ли присвоить значение переменной при ее объявлении
Доброго дня всем Имеется общая строковая переменная, в которой должен хранится путь к активной...

Зачем переменной задавать значение при объявлении?
Всем добрый вечер! Хотелось бы у Вас спросить, дело такое: я пишу векторный редактор, и мне...

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

const char не инициализируется при объявлении
Доброго времени суток. Прошу помощи есть код std::string f = "бла-бла-бла"; ... const char*...

17
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
27.08.2015, 14:09 2
Адрес указателя можно поменять.
Значение простой переменной поменять нельзя.
1
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,252
27.08.2015, 14:16 3
Цитата Сообщение от levgen Посмотреть сообщение
При объявлении const у нас значение переменной или адрес переменной не изменяется?
Адрес не меняется никак. Где объект создан, там он всю свою жизнь и находится. const не позволяет менять значение переменной. Точнее даже, это уже не переменная, а константа.

С указателяси чуть сложнее. Может быть сам указатель константный, т.е. указывает на какой-то объект и никак это не поменять, но зато сам объект через этот указатель менять можно. А может быть константным объект, на который указывает, а сам указатель можно "направлять" на разные объекты в процессе работы.
2
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.08.2015, 14:20 4
Лучший ответ Сообщение было отмечено levgen как решение

Решение

Цитата Сообщение от ture Посмотреть сообщение
Адрес указателя можно поменять.
смотря как объявить указатель.
C++
1
2
3
4
5
const int * n; // можно менять адрес, но нельзя - значение
int * const m; // можно менять значение, но нельзя - адрес
const int * const p; // ничего нельзя менять
// если переменная  - не указатель, то ее адрес изменить нельзя в принципе
 const int a; // нельзя менять значение
2
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,252
27.08.2015, 14:21 5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
если переменная *- не указатель, то ее адрес изменить нельзя в принципе
Адрес указателя тоже поменять нельзя. Можно поменять значение указателя, которое как раз является адресом чего-нибудь.
1
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
27.08.2015, 14:22  [ТС] 6
А еще такой вопрос, ключевое слово const указывает, что объект или переменная не могут изменяться.
А какое еще есть применение этого const?
0
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,252
27.08.2015, 14:25 7
Цитата Сообщение от levgen Посмотреть сообщение
А какое еще есть применение этого const?
Можно объявлять константными функции-члены класса:
C++
1
2
3
4
5
6
7
class A
{
    void func() const;
};
// ...
A a;
a.func();
Это будет означать, что данная функция не может изменить состояние объекта a.
1
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.08.2015, 14:28 8
Цитата Сообщение от John Prick Посмотреть сообщение
Адрес указателя тоже поменять нельзя.
Я неправильно выразился

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
int a = 10, b = 15;
    int * const m = &a;
    const int * p = &a;
    const int * const c = &a;
    *m = 5;  // OK!
    m = &b;  // Ошибка!!!
    *p = 5;  // Ошибка!!!
    p = &b;  // OK!
    c = &b;  // Ошибка!!!
    *c = 20; // Ошибка!!!
0
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
27.08.2015, 14:58  [ТС] 9
а какая еще особенность функции-член константы помимо того, что она не может вызвать какую-либо функцию-член, не являющуюся константой?
0
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,252
27.08.2015, 15:03 10
Цитата Сообщение от levgen Посмотреть сообщение
а какая еще особенность функции-член константы помимо того, что она не может вызвать какую-либо функцию-член, не являющуюся константой?
Ну и члены-данные никакие менять не может.
C++
1
2
3
4
5
6
7
8
class A
{
    int x;
    void func() const
    {
        ++x; // айай, ошибка компиляции.
    }
};
Ну и раз речь зашла, то если горько надо всё-таки поменять члены-данные в константной функции, то их можно обозначить с помощью кл.слова mutable
C++
1
2
3
4
5
6
7
8
class A
{
    mutable int x;
    void func() const
    {
        ++x; // нет проблем
    }
};
1
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
27.08.2015, 15:12  [ТС] 11
John Prick, ну немного редактируя, то правильный ответ такой - нельзя изменять члены класса
0
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,252
27.08.2015, 15:20 12
levgen, в целом да, но лучше тогда найти в какой-нибудь литературе более точное определение. Я просто своими словами передал.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 15:49 13
Цитата Сообщение от John Prick Посмотреть сообщение
Это будет означать, что данная функция не может изменить состояние объекта a.
http://rextester.com/ZQZ62554

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>
 
struct data
{
    mutable int v = 100;
    
    void foo(const int a)const
    {
        v = a;
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const data d;
    std::cout<<"before: "<<d.v<<'\n';
    
    d.foo(333);
    
    std::cout<<"after: "<<d.v<<'\n';
    
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.08.2015, 15:58 14
Давайте ещё const_cast'ами побалуемся
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
struct S {
    void f() const 
    {
        const_cast<S*>(this)->i = 42;
    }
    int i = 100500;
};
 
int main() {
 
    S s;
    cout << s.i << endl;
 
    s.f();
    cout << s.i << endl;
 
    return 0;
}
1
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,252
27.08.2015, 15:59 15
hoggy, я ниже про mutable сказал.
0
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
27.08.2015, 21:39 16
Tulosba, а этот код всегда должен работать нормально? Или UB?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 22:35 17
Цитата Сообщение от Новичок Посмотреть сообщение
этот код всегда должен работать нормально? Или UB?
конкретно этот - всегда.

а вообще нарваться на UB легко:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
struct S {
    void f() const 
    {
        const_cast<S*>(this)->i = 42;
    }
    int i = 100500;
};
 
int main() {
 
    const S s;
    cout << s.i << endl;
 
    s.f();
    cout << s.i << endl;
 
    return 0;
}
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.08.2015, 23:14 18
Цитата Сообщение от Новичок Посмотреть сообщение
а этот код всегда должен работать нормально? Или UB?
Если в итоге мы работаем с объектом, который не является константным в момент создания (строка 14), то всё ок. Если же пытаемся убрать константность у объекта, изначально созданного константным (как показал hoggy), то получим UB. Более подробно можно посмотреть в Стандарте 7.1.6.1 The cv-qualifiers.
1
27.08.2015, 23:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2015, 23:14
Помогаю со студенческими работами здесь

Как при объявлении приписать к имени переменной счётчик цикла?
Здравствуйте. Как в данном коде приписывать к именам переменных счётчик цикла: for (int i = 1; i...

Нюансы синтаксиса: куда прижимать звёздочку при объявлении указателя - к имени типа или к имени переменной?
Скажите, пожалуйста, в чём отличие таких записей: int *px int* px int *px = new int int *px =...

Как при объявлении переменной типа Sprite сразу задать нужный спрайт
using System.Collections; using System.Collections.Generic; using UnityEngine; public class...

Как в адрес переменной ввести значение
Доброго времени суток! Проблема в том что переменная &quot;ID&quot; сама считается и вводиться, и как её...

Изменяется значение переменной
Привет, не понятно почему меняется значение переменной Theme.ID, в первой форме принимает значение...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru