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

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

Войти
Регистрация
Восстановить пароль
 
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
#1

Беру и спокойно вызываю неконстантную функцию для константного объекта - C++

07.04.2014, 19:20. Просмотров 235. Ответов 6
Метки нет (Все метки)

Это как ? Везде пишут, что сие невозможно в принципе. Или есть исключение для конструктора ?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
class test
{
private:
    int a;
 
public:
    test(int a1) {set(a1);}
    void set(int a2) {a=a2;}
};
 
int main()
{
    const test T(3);
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2014, 19:20     Беру и спокойно вызываю неконстантную функцию для константного объекта
Посмотрите здесь:

C++ вывод константного стринга..срочно
C++ Изменения константного значения
C++ warning C4309: =: усечение константного значения
C++ Инициализация константного статического объекта - члена класса
C++ Увеличить предел константного целочисленного литерала
C++ тема Наследование правильно ли я вызываю диструктор
Как создать отдельную функцию для каждого объекта класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,903
Записей в блоге: 17
07.04.2014, 19:23     Беру и спокойно вызываю неконстантную функцию для константного объекта #2
А как ты поразумеваеш создание константы без ее инициализации ?
Кроме того конструктор и деструктор не совсем ф-ции.
zss
Модератор
Эксперт С++
 Аватар для zss
6112 / 5715 / 1849
Регистрация: 18.12.2011
Сообщений: 14,597
Завершенные тесты: 1
07.04.2014, 19:24     Беру и спокойно вызываю неконстантную функцию для константного объекта #3
А попробуйте вызвать
C++
1
T.set(1);
Полегчало?
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
07.04.2014, 19:33  [ТС]     Беру и спокойно вызываю неконстантную функцию для константного объекта #4
zss
Речь изначально о другой ситуации. О вызове неконстантной set из конструктора.

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

Кроме того конструктор и деструктор не совсем ф-ции.
А что это тогда ? Что вы понимаете под "совсем функциями"?
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,903
Записей в блоге: 17
07.04.2014, 19:34     Беру и спокойно вызываю неконстантную функцию для константного объекта #5
Цитата Сообщение от mariko_11 Посмотреть сообщение
И тем не менее, возможность вызова неконстантной функции, не являющейся конструктором, смущает. Кстати, что говорит стандарт о такой ситуации?
Так у вас как раз конструктор.

Цитата Сообщение от mariko_11 Посмотреть сообщение
А что это тогда ?
Это конструктор и деструктор
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
07.04.2014, 20:05  [ТС]     Беру и спокойно вызываю неконстантную функцию для константного объекта #6
Так у вас как раз конструктор.
И функция set.
Поясняю, что смутило.
Дейтел, "Как программировать на C"
"Компиляторы C++ соблюдают объявления const настолько строго, что ими полностью отвергаются любые вызовы элементов-функций для константных объектов"
Конструктору можно менять объект. Другим элементам-функциям - нельзя. Чёрным по белому. А тут оказывается, что раз из конструктора, то МОЖНО. Что на этот счёт говорит стандарт ? Везде ли можно звать из конструктора неконстантные элементы-функции ? Или так делают только некоторые компиляторы ?

Это конструктор и деструктор
Чем именно они отличаются от "совсем функций"?

Добавлено через 21 минуту
Итак, стандарт, п. 12.1.4:
A constructor shall not be virtual (10.3) or static (9.4). A constructor can be invoked for a const,
volatile or const volatile object. A constructor shall not be declared const, volatile, or const
volatile (9.3.2). const and volatile semantics (7.1.6.1) are not applied on an object under construction.
They come into effect when the constructor for the most derived object (1.8) ends.
Видимо фраза про семантику вставлена не ради красного словца. А в учебнике про это, кстати, ни слова. Нельзя к константному объекту применять неконстантные функции и всё. Момент на самом деле неочевидный.

Тему можно закрыть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2014, 20:07     Беру и спокойно вызываю неконстантную функцию для константного объекта
Еще ссылки по теме:

C++ Как из константной функции вызвать неконстантную?
C++ Ошибка при обращении к методу константного объекта
Ошибка в коде. Почему не правильно вызываю функцию? C++
C++ Добрый вечер! Передача в функцию константного значения и обьявление им массива
C++ Изменение константного поля класса

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

Или воспользуйтесь поиском по форуму:
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
07.04.2014, 20:07     Беру и спокойно вызываю неконстантную функцию для константного объекта #7
По стандарту, конструктор не может быть const/volatile/const volatile, так как он используется для инициализации.
Был предложен rfc http://www.open-std.org/jtc1/sc22/wg...1995/N0798.htm, можете почитать чем он закончился.
Yandex
Объявления
07.04.2014, 20:07     Беру и спокойно вызываю неконстантную функцию для константного объекта
Ответ Создать тему
Опции темы

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