Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
1

Параметр конструктора класса нигде не задействован, но его отсутствие влияет на компиляцию, почему так?

18.10.2014, 19:30. Показов 508. Ответов 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
#include <string>
#include <vector>
using namespace std;
 
//////////////////////////////////////////
 
class kl
{
         public:
         
         kl (bool x) {}
         
         //если использовать этот конструктор а тот, 
         //что повыше, закомментить, то не сокмпилится
         //kl () {}
         
         vector<string> g; 
};
 
//////////////////////////////////////////
 
kl f ()
{
 return NULL;
}
 
//////////////////////////////////////////
Не смешно ни разу. Если для возврата значения NULL, класс должен на одной из стадий тык скыть своей жизни использовать ЧТО-НИБУДЬ ПОХОЖЕЕ НА NULL (я по другому и сформулировать-то не могу), то это должно в учебниках каких-то что ли, быть написано. В общем, где бы прочесть про такое поведение? Почему параметр, который ни на что не влияет явно, влияет косвенно на результат компиляции? Может, у меня компилятор плохой g++ 4.6.2? Спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2014, 19:30
Ответы с готовыми решениями:

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую...

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string...

Как вызвать методы класса из его конструктора
Добрый день! Начал изучать язык, но столкнулся с проблемами(ответов в учебниках найти не смог):...

Почему лучше инициализировать объекты класса во время инициализации конструктора?
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

5
3247 / 2049 / 351
Регистрация: 24.11.2012
Сообщений: 4,902
18.10.2014, 19:38 2
Кроме шуток, это уже третья тема по одному и тому же вопросу.
Цитата Сообщение от kravam Посмотреть сообщение
kl f ()
{
*return NULL;
}
Функция возвращает объект по значению. Нельзя просто так взять и вернуть NULL.

Добавлено через 2 минуты
Что тут происходит: NULL неявно приводится к bool и вызывается конструктор с параметром kl(0), он же kl(false).
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
18.10.2014, 19:40  [ТС] 3
Цитата Сообщение от 0x10 Посмотреть сообщение
Кроме шуток, это уже третья тема по одному и тому же вопросу.
первая
0
С чаем беда...
Эксперт CЭксперт С++
9127 / 4646 / 1267
Регистрация: 18.10.2014
Сообщений: 10,481
18.10.2014, 19:56 4
Так а в чем загвоздка-то?

Объект класса не может иметь значения 'NULL'. Поэтому если вы написали функцию, которая возвращает тип 'kl', а внутри функции у вас вдруг написано 'return NULL;', то у такого кода есть только один шанс скомпилироваться - если компилятор найдет способ каким-то образом неявно преобразовать значение 'NULL' в значение типа 'kl'.

В данном случае единственным способом преобразовать значение 'NULL' к типу 'kl' является конвертирующий конструктор 'kl::kl(bool)'. Именно этим конструктором компилятор и пользуется для выполнения преобразования. А именно, когда вы пишете в своей функции 'return NULL;' на самом деле это интерпретируется компилятором как 'return kl(NULL);', т.е. вызывается ваш конструктор 'kl::kl(bool)'. Т.е. создается временный объект типа 'kl' и используется в качестве возвращаемого значения.

Если вы уберете из класса конвертирующий конструктор 'kl::kl(bool)', то подходящего конвертирующего конструктора больше не будет, а код 'return NULL;' сразу же потеряет всякий смысл. Компилятор больше не сможет преобразовать значение 'NULL' к типу 'kl' и код больше не будет компилироваться.

Вот и все.

Тут можно добавить еще две вещи.

Во-первых, компилятор может так втихаря использовать конвертирующий конструктор 'kl::kl(bool)' только потому, что вы не объявили его 'explicit'. Если вы объявите ваш конструктор как

C++
1
explicit kl(bool x);
то компилятор не сможет использовать его неявно. Код 'return NULL;' перестанет компилироваться, а вот 'return kl(NULL);' по-прежнему будет компилироваться (но см. "во-вторых").

Во-вторых, вам повезло, что значение 'NULL' в вашем компиляторе может использоваться как значение типа 'bool'. Действительно в "традиционном" языке С++ макро 'NULL' определялось как целочисленный константный нуль. Поэтому оно прекрасно работало с типом 'bool'. Однако в языке С++11 допускается определение 'NULL' как 'nullptr'. А вот 'nullptr' уже не будет работать с типом 'bool', т.е. ваш код не будет компилироваться в принципе ни в одном из вариантов.

Другими словами, если функция объявлена с типом возврата 'kl', то возвращать из нее 'NULL' - полнейшая бессмыслица. 'NULL' предназначен для работы с указателями и используется только с указателями. Не надо пытаться использовать 'NULL' где-либо еще.

Добавлено через 8 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
...Во-вторых, вам повезло, что значение 'NULL' в вашем компиляторе может использоваться как значение типа 'bool'. Действительно в "традиционном" языке С++ макро 'NULL' определялось как целочисленный константный нуль. Поэтому оно прекрасно работало с типом 'bool'. Однако в языке С++11 допускается определение 'NULL' как 'nullptr'. А вот 'nullptr' уже не будет работать с типом 'bool', т.е. ваш код не будет компилироваться в принципе ни в одном из вариантов...
Т.е. к примеру если сегодня ваш компилятор проглатывает вот это

C++
1
bool b = NULL;
то завтра он может оказаться это проглатывать.
0
15100 / 8104 / 1955
Регистрация: 30.01.2014
Сообщений: 13,764
18.10.2014, 21:46 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А вот 'nullptr' уже не будет работать с типом 'bool', т.е. ваш код не будет компилироваться в принципе ни в одном из вариантов...
Интересно, где это написано?
Насколько мне известно, nullptr прекрасно конвертится в bool и параграф 4.12 это подтверждает.
A zero value, null pointer value, or null member pointer value is converted to false;
any other value is converted to true.
0
С чаем беда...
Эксперт CЭксперт С++
9127 / 4646 / 1267
Регистрация: 18.10.2014
Сообщений: 10,481
18.10.2014, 21:54 6
Цитата Сообщение от DrOffset Посмотреть сообщение
Интересно, где это написано?
Виноват, был не прав. Действительно, конвертируемость 'nullptr' в 'bool' никто не отменял и отменять не собирается.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2014, 21:54

Помощь в написании контрольных, курсовых и дипломных работ здесь.

После удаления компонента ComboBox выдает сообщение, что с ним что-то не так, хотя его нигде в этом файле нет
Unresolved external '__fastcall TForm_Vse::ComboBox_DolgnostChange(System::TObject *)' referenced...

Почему после конструктора первого класса стоит двоеточие и имя переменной, а не инициализация?
#include &lt;iostream&gt; template &lt;typename T&gt; class first { public: T value; first (T n) :...

На что влияет отсутствие лицензии у Windows 10?
Привет. Если установить Windows 10 , но не покупать лицензию, то вроде как всё работает. Только при...

Как влияет отсутствие внешних ссылок на рейтинги
Интересно узнать мнение специалистов о том, как влияет отсутствие внешних ссылок на ИЦ и ПР? ...

Почему при вызове конструктора из конструктора нельзя передавать this как аргумент?
Есть такой код: public class Order { { } Order(){ ...

Директива using: Как её наличие/отсутствие влияет на итоговый код, выдаваемый компилятором?
Недавно задался вопросом, как же работает директива using. То, что эта директива даёт некоторые...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.