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

Пара вопросов по С++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 09:03     Пара вопросов по С++ #1
возникло несколько вопросов, с которыми что то не могу никак разобраться

1. Как происходит выравнивание при создании структуры?

C++
1
2
struct { double a; int b; char c;};
struct { char a; int b; double c; };
ведь должны возвращать разный размер? В первом всё достраивается до double, а во втором сначала до int, потом до double? Но тем не менее, проверив в двух компиляторах(в VS2005 и bcc5.5) я получил результат и там и там 16(double=8), который никак не могу понять

2. Про добавление константности
пусть есть класс:

C++
1
2
3
4
5
6
7
8
9
10
11
class A {
public:
 A() {}
 A(const A&) { printf("Copy constructor called\n"); }
 void doSmth() { printf("Non-const method called"); }
 void doSmth() const { printf("Const method called"); }
};
...
A a;
a.doSmth();
(static_cast<const A>(a)).doSmth();
т.е. хочу вызвать константный и неконстантный методы. Но с константным и начинаются проблемы.
C++
1
static_cast<const A>(a)
почему то игнорируется, результат этой конструкции -- класс А(проверял через typeid). Не могу понять почему? Если поставить приведение к ссылке - всё будет работать, оно и понятно - мы просто сообщаем компилятору, что в этой конструкции адресуется объект типа "const A", но почему не срабатывает простое приведение? Я считал, что в этом случае, будет создаваться временный объект нужного типа, но судя по тому, что копирующий конструктор не вызывается, этого не происходит. Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2010, 09:03     Пара вопросов по С++
Посмотрите здесь:

пара вопросов по GUI C++
C++ вставление строк и пара вопросов
Пара вопросов про массивы C++
C++ Пара вопросов по функторам stl
Пара вопросов по итераторам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
16.07.2010, 09:37     Пара вопросов по С++ #2
Цитата Сообщение от el Gato Estelar Посмотреть сообщение
1. Как происходит выравнивание при создании структуры?
Каждое поле выравнивается на значение, соответствующее выравниванию типа поля. Вся структура будет выравниваться на максимальное из выравниваний полей.

В случае первой структуры у тебя будет: 8 байт "a", 4 байта "b", 1 байт "c" + 3 байта дырка. Размер (sizeof) структуры 16
Во втором случае: 1 байт "a", 3 байта дырка (чтобы поле "b" оказалось выровненным на 4 байта), 4 байта "b", 8 байт "c". Размер так же 16. Если после поля "b" добавишь ещё один char, то после него появится дополнительная в 7 байт, чтобы поле "c" оказалось выровненным на 8 байт

Цитата Сообщение от el Gato Estelar Посмотреть сообщение
Не могу понять почему?
Может проблема в том, что в конце printf'А надо перевод строки воткнуть (без него вывод буфферизуется и на экран не выводится, а потом у тебя экран пропадает)
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 09:55  [ТС]     Пара вопросов по С++ #3
спасибо за разъяснение, в первой части я примерно так и предполагал, просто не был уверен.

по поводу второго -- там дело не в том, что что то на экран не выводится -- в оригинале не вывод на экран, это просто для проверки, а вопрос в том,почему после приведения static_cast<const A>(a)
тип полученного выражения будет A, а не const A. Проверял так:
C++
1
printf("%s", typeid(static_cast<const A>(a)).name());
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
16.07.2010, 10:15     Пара вопросов по С++ #4
Ну это уже к специалистам по Си++. Хотя конкретно в данной ситуации я не очень понимаю, какое это имеет значение
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.07.2010, 11:25     Пара вопросов по С++ #5
Цитата Сообщение от el Gato Estelar Посмотреть сообщение
почему после приведения static_cast<const A>(a)
тип полученного выражения будет A, а не const A.
cv квалификаторы не влияют на тип объекта, они лишь добавляют соответсвующие атрибуты к самому объекту.
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 12:04  [ТС]     Пара вопросов по С++ #6
мм..ну формально типы const A и A - разные, кроме того,
C++
1
printf("%s", typeid(static_cast<const A&>(a)).name());
выдаст "const A&"
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
16.07.2010, 12:16     Пара вопросов по С++ #7
C++
1
2
3
    A a;
    a.doSmth();
    const_cast<const A&>(a).doSmth();
Non-const method called
Const method called
Ты этого добивался?
Компилятор GCC 4.5.0.
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 12:17  [ТС]     Пара вопросов по С++ #8
Да, добивался я этого. Я понял, что нужно было приводить к const A&, а не к const A
Остался только вопрос -- почему?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.07.2010, 12:30     Пара вопросов по С++ #9
Цитата Сообщение от el Gato Estelar Посмотреть сообщение
формально типы const A и A разные
Это не так:
C++
1
bool equal = typeid(A) == typeid(const A); // equal всегда истинно
cv квалификаторы не влияют на тип объекта.
Цитата Сообщение от el Gato Estelar Посмотреть сообщение
Остался только вопрос -- почему?
A и A& - это два разных типа.
C++
1
2
static_cast<const A>(a);  // Типы совпадают, приведение не сработает
static_cast<const A&>(a); // Типы разные, приведение срабатывает
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 12:39  [ТС]     Пара вопросов по С++ #10
понял, спасибо за разъяснение
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
16.07.2010, 21:43     Пара вопросов по С++ #11
Во-первых, непонятно, почему вы для навешивания const используете static_cast, а не const_cast, который для этого предназначен.
Во-вторых, и const_cast здесь не срабатывает. Компилятор ругается вот таким образом:

error C2440: 'const_cast' : cannot convert from 'main::A' to 'const main::A'
1> Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast.

Хотя в книжках пока ничего не нашел по этому поводу.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.07.2010, 22:32     Пара вопросов по С++ #12
Цитата Сообщение от Mr.X Посмотреть сообщение
Во-первых, непонятно, почему вы для навешивания const используете static_cast, а не const_cast, который для этого предназначен.
Наоборот, const_cast предназначен для снятия константности.
Константность на неконстантный объект никак не "навешать".
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
17.07.2010, 11:35     Пара вопросов по С++ #13
В некоторых источниках, ссылающихся на стандарт, говорится, что «оператор const_cast производит приведение типа, при котором удаляются или добавляются cv-квалификаторы».
Да и на форумах многие так его трактуют. Интересно все же что сказано в стандарте (я, признаться, не силен в тарабарском).
И, кстати, существуют ли переводы стандарта на русский?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.07.2010, 11:58     Пара вопросов по С++ #14
Цитата Сообщение от Mr.X Посмотреть сообщение
В некоторых источниках, ссылающихся на стандарт, говорится, что «оператор const_cast производит приведение типа, при котором удаляются или добавляются cv-квалификаторы».
Стандарта под рукой нет, но со 99% уверенностью могу сказать что, const_cast может только снять константность, кроме того, вот выдержка с MSDN:
Цитата Сообщение от MSDN
Removes the const, volatile, and __unaligned attribute(s) from a class.
Цитата Сообщение от Mr.X Посмотреть сообщение
я, признаться, не силен в тарабарском
Это печально, больше практикуйся в чтении.
Цитата Сообщение от Mr.X Посмотреть сообщение
И, кстати, существуют ли переводы стандарта на русский?
Не встречал, да и зачем? Это довольно таки специфический документ, чтобы его переводить.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
17.07.2010, 14:29     Пара вопросов по С++ #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Стандарта под рукой нет, но со 99% уверенностью могу сказать что, const_cast может только снять константность
Из своего опыта я вывел, что в программировании нет ничего вреднее, чем основываться на недоказанных предположениях.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это печально, больше практикуйся в чтении.
Надо будет распечатать стандарт и почитывать на ночь.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не встречал, да и зачем? Это довольно таки специфический документ, чтобы его переводить.
На каком-то сайте один товарищ несколько лет назад грозился перевести, но видимо что-то у него не сложилось.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.07.2010, 14:43     Пара вопросов по С++ #16
Цитата Сообщение от Mr.X Посмотреть сообщение
Из своего опыта я вывел, что в программировании нет ничего вреднее, чем основываться на недоказанных предположениях.
Это верно, но в данном случае, у меня нет никаких сомнений в том, для чего нужен const_cast.
Вот нарыл фрагмент из С++98:
Цитата Сообщение от С++98
a function can change the values of its non-const parameters, but these changes cannot affect the values of the arguments except where a parameter is of a reference type (dcl.ref); if the reference is to a const-qualified type, const_cast is required to be used to cast away the constness in order to modify the argument's value. Where a parameter is of const reference type a temporary object is introduced if needed (dcl.type, lex.literal, lex.string, dcl.array, class.temporary). In addition, it is possible to modify the values of nonconstant objects through pointer parameters.
Цитата Сообщение от Mr.X Посмотреть сообщение
Надо будет распечатать стандарт и почитывать на ночь.
Думаю для начала это будет слишком сложное чтение.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
17.07.2010, 15:02     Пара вопросов по С++ #17
Цитата Сообщение от Mr.X Посмотреть сообщение
На каком-то сайте один товарищ несколько лет назад грозился перевести, но видимо что-то у него не сложилось
Если посмотреть на переводную техническую литературу, то зачастую многие вещи на русском языке попросту не понять, не видя оригинала. В случае стандарта это будет полный трындец.

Как-то мне довелось читать документацию от велосипедной цепи (процесс установки) на английском. Я не считаю себя большим специалистом в английском языке, но без поллитры и консилиума в три рыла это не переводилось. Лишь какое-то время спустя я узнал, что эта документация родилась после того, как голландцы перевели её с японского на английский.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
17.07.2010, 15:42     Пара вопросов по С++ #18
Цитата Сообщение от Evg Посмотреть сообщение
Если посмотреть на переводную техническую литературу, то зачастую многие вещи на русском языке попросту не понять, не видя оригинала. В случае стандарта это будет полный трындец..
Ну, он собирался его как Библию издать: слева священный текст - справа перевод.
Библию перевели же, а она поспецифичнее будет.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
17.07.2010, 18:19     Пара вопросов по С++ #19
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, он собирался его как Библию издать: слева священный текст - справа перевод.
Ну разве что так... И много он там уже перевёл? Или кроме закидонов пальцами пока ничего нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2010, 00:18     Пара вопросов по С++
Еще ссылки по теме:

C++ Пара вопросов о рандомайзере и RadioButton
Пара глупых вопросов C++
C++ Пара вопросов по C++ 11

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
18.07.2010, 00:18     Пара вопросов по С++ #20
Цитата Сообщение от Evg Посмотреть сообщение
Ну разве что так... И много он там уже перевёл? Или кроме закидонов пальцами пока ничего нет?
http://zouev.blogspot.com/2010_01_01_archive.html
Yandex
Объявления
18.07.2010, 00:18     Пара вопросов по С++
Ответ Создать тему
Опции темы

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