Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2011, 10:58   #1
sergestus
 
Регистрация: 26.10.2011
Сообщений: 3
По умолчанию Странное поведение транслятора

В следуюшем примере код компилируется нормально, но объект класса b не содается (пробовал на Visual studio 10 и на Borland builder 5), что бы это могло значить?

struct a
{
public:
a(){}
};


class b
{
public:
b(){}
b(a a_)
{
printf("!!!");
}
};


int main(int argc, char* argv[])
{
b b_(a()); // compiles, but doesn't create a code for this string ???

return 0;
}
sergestus вне форума Ответить с цитированием
Старый 26.10.2011, 13:16   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

так он же нигде не используется.
f.hump вне форума Ответить с цитированием
Старый 26.10.2011, 14:37   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от sergestus Посмотреть сообщение
В следуюшем примере код компилируется нормально, но объект класса b не содается (пробовал на Visual studio 10 и на Borland builder 5), что бы это могло значить?

struct a
{
public:
a(){}
};


class b
{
public:
b(){}
b(a a_)
{
printf("!!!");
}
};


int main(int argc, char* argv[])
{
b b_(a()); // compiles, but doesn't create a code for this string ???

return 0;
}
Код:
b b_(a());
это не то что ты думаешь. ты тут НЕ создаешь объект.
это объявление функции с именем b_, которая возвращает объект типа b и принимает 1 аргумент - указатель на функцию, которая возвращает объект типа a и не принимает параметров
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.10.2011, 14:46   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
это не то что ты думаешь. ты тут НЕ создаешь объект.
это объявление функции с именем b_, которая возвращает объект типа b и принимает 1 аргумент - указатель на функцию, которая возвращает объект типа a и не принимает параметров
страшный С++
но в принципе оно и ясно, не припомню чтоб можно было так создавать локальные обьекты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.10.2011, 14:59   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Попробуй:
Код:
b b_ = a();
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 26.10.2011, 15:02   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса
если очень хочется, то можно написать так
Код:
bbb b = bbb(aaa());
при этом конструктор копирования должен быть доступен, но его реализация не всегда обязательна (нормальный компилятор оптимизирует это выражение, и копирующий конструктор вызван не будет)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.10.2011, 15:08   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
Вопрос Если мне не изменяет память

Цитата:
Сообщение от pproger Посмотреть сообщение
при этом конструктор копирования должен быть доступен, но его реализация не всегда обязательна (нормальный компилятор оптимизирует это выражение, и копирующий конструктор вызван не будет)
Насколько помню Страуструпа, приведённое выражение - это одна из форм инициализатора. Соответственно, конструктор копирования здесь вызываться не должен вообще.
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 15:11   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

--------удалено--------------
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.10.2011, 15:17   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Abstraction
по стандарту компилятору разрешается либо выкинуть, либо оставить копирующий конструктор. на всех компиляторах, с которыми я работал в таких ситуациях он выкидывался. гарантировать везде и всегда это нельзя

пс. вон кстати, в vc6 пишут, что вызывается 2 конструктора сервис пак не знаю
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 26.10.2011 в 15:25.
pproger вне форума Ответить с цитированием
Старый 26.10.2011, 15:49   #10
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Это же инициализация, вот например. У int ведь нету конструктора =)
Код:
int i = int(5);
Или вот по умолчанию инициализация нулем:
Код:
int i = int();
Кстате, если написать :
Код:
explicit b(a a_){
    printf("!!!");
}
Тогда уже не будет работать запись: b b_ = a();

То в такой ситуации как лучше ? =)

Последний раз редактировалось An1ka; 26.10.2011 в 16:00.
An1ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Com порт - странное поведение BoozZzilla Общие вопросы Delphi 10 16.07.2011 01:39
Странное поведение чисел.... sult9191 Общие вопросы по Java, Java SE, Kotlin 2 20.01.2011 17:12
Странное поведение realloc eraserhp Общие вопросы C/C++ 7 17.05.2010 09:52
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное поведение null Vitalyk JavaScript, Ajax 6 13.02.2010 15:22