2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
1

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

07.04.2014, 19:20. Показов 978. Ответов 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;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2014, 19:20
Ответы с готовыми решениями:

Изменение константного объекта с применением const_cast
1. Это код из учебника С. Прата &quot;Лекции и упражнения&quot;. #include &lt;iostream&gt; using namespace...

Ошибка при обращении к методу константного объекта
Есть некий класс, в нем есть метод const size_t Length(); пишу оператор сложения Class&amp; operator...

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является...

Unexpected unident когда вызываю функцию
Привет, когда вызываю функцию появляется ошибка. Но проблем с табами я не вижу... def...

6
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2014, 19:23 2
А как ты поразумеваеш создание константы без ее инициализации ?
Кроме того конструктор и деструктор не совсем ф-ции.
0
Модератор
Эксперт С++
12460 / 10018 / 6031
Регистрация: 18.12.2011
Сообщений: 26,822
07.04.2014, 19:24 3
А попробуйте вызвать
C++
1
T.set(1);
Полегчало?
0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
07.04.2014, 19:33  [ТС] 4
zss
Речь изначально о другой ситуации. О вызове неконстантной set из конструктора.

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

Кроме того конструктор и деструктор не совсем ф-ции.
А что это тогда ? Что вы понимаете под "совсем функциями"?
0
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.04.2014, 19:34 5
Цитата Сообщение от mariko_11 Посмотреть сообщение
И тем не менее, возможность вызова неконстантной функции, не являющейся конструктором, смущает. Кстати, что говорит стандарт о такой ситуации?
Так у вас как раз конструктор.

Цитата Сообщение от mariko_11 Посмотреть сообщение
А что это тогда ?
Это конструктор и деструктор
0
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.
Видимо фраза про семантику вставлена не ради красного словца. А в учебнике про это, кстати, ни слова. Нельзя к константному объекту применять неконстантные функции и всё. Момент на самом деле неочевидный.

Тему можно закрыть.
0
502 / 351 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
07.04.2014, 20:07 7
По стандарту, конструктор не может быть const/volatile/const volatile, так как он используется для инициализации.
Был предложен rfc http://www.open-std.org/jtc1/s... /N0798.htm, можете почитать чем он закончился.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2014, 20:07
Помогаю со студенческими работами здесь

Ошибка в коде. Почему не правильно вызываю функцию?
Собственно вот код ошибки. 18 8 D:\C++\Task7.1.1.cpp case label value is less than minimum value...

Добрый вечер! Передача в функцию константного значения и обьявление им массива
Вот у меня есть функция с объявленым массивом внутри: f(const int &amp;C) { int mass; } Где тут...

линкую статическую библиотеку Strstr1.lib , и вызываю функцию, а программа ее невидит
есть файл статической библиотеки Strstr1.lib код которого ниже //Strstr1.cpp #include...

Вызываю функцию из dll, программа "падает"
Здравствуйте. Имеется dll написанная на с++ (исходного кода нет), в которой есть функция ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru