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

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

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

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

16.07.2010, 09:03. Просмотров 1979. Ответов 30
Метки нет (Все метки)

возникло несколько вопросов, с которыми что то не могу никак разобраться

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     Пара вопросов по С++
Посмотрите здесь:

Пара вопросов по C++ 11 - C++
1. чем отличаются std::forward_list и std::initializer_list? 2. не получается применять constexpr в msvs 2013 pro constexpr auto n = 0;...

пара вопросов по GUI - C++
1) итак, посмотрел Inter PRO одного банка. При наборе в IE адреса он каким-то образом переадресует запущенному Inter PRO, он в свою очередь...

Пара глупых вопросов - C++
Помогите please,please,please. Не могу понять в чем туплю, надо всего-то записать двумерный массив в файл ну и я пишу (Уже есть массив...

Пара вопросов по итераторам - C++
1. Почему в этом коде элементы удаляются через одного? for (std::vector &lt;int&gt;::iterator j = vector.begin(); j &lt; vector.end(); j++) ...

Пара вопросов о рандомайзере и RadioButton - C++
1) srand((unsigned)time(NULL)); int rand_ = rand()%10; rand_ будет равен от 0 до 9 включительно или от 0 до 10 включительно? ...

вставление строк и пара вопросов - C++
вычислить и вывести на экран в виде таблицы значение функции F на интервале от Xнач до Xконч с шагом Dx задана система: ...

Пара вопросов про массивы - C++
у меня есть пара вопросов,хотя один можно сказать относится к функциям..но тема у нас в курсе-массивы. Так вот: 1.void main() { const...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,901
Записей в блоге: 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
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
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,901
Записей в блоге: 26
16.07.2010, 10:15     Пара вопросов по С++ #4
Ну это уже к специалистам по Си++. Хотя конкретно в данной ситуации я не очень понимаю, какое это имеет значение
CyBOSSeR
Эксперт C++
2300 / 1670 / 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
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
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
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
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 12:17  [ТС]     Пара вопросов по С++ #8
Да, добивался я этого. Я понял, что нужно было приводить к const A&, а не к const A
Остался только вопрос -- почему?
CyBOSSeR
Эксперт C++
2300 / 1670 / 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
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 12:39  [ТС]     Пара вопросов по С++ #10
понял, спасибо за разъяснение
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.07.2010, 22:32     Пара вопросов по С++ #12
Цитата Сообщение от Mr.X Посмотреть сообщение
Во-первых, непонятно, почему вы для навешивания const используете static_cast, а не const_cast, который для этого предназначен.
Наоборот, const_cast предназначен для снятия константности.
Константность на неконстантный объект никак не "навешать".
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.07.2010, 11:35     Пара вопросов по С++ #13
В некоторых источниках, ссылающихся на стандарт, говорится, что «оператор const_cast производит приведение типа, при котором удаляются или добавляются cv-квалификаторы».
Да и на форумах многие так его трактуют. Интересно все же что сказано в стандарте (я, признаться, не силен в тарабарском).
И, кстати, существуют ли переводы стандарта на русский?
CyBOSSeR
Эксперт C++
2300 / 1670 / 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 Посмотреть сообщение
И, кстати, существуют ли переводы стандарта на русский?
Не встречал, да и зачем? Это довольно таки специфический документ, чтобы его переводить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2010, 14:29     Пара вопросов по С++
Еще ссылки по теме:

Пара вопросов по функторам stl - C++
Доброго времени суток! У меня возникло пара вопросов по функторам. Может кто чего подскажет? Вопрос 1. В нижеследующем коде в...

Конструкторы и деструкторы при наследовании. Пара вопросов - C++
1. Можно ли создавать виртуальный конструктор/деструктор и переопределять его без создания нового конструктора в производном классе? 2....

Структура-пара - C++
Помогите пожалуйста решить задачу, очень нужно. Поле first - дробное число; поле second - дробное число, показатель степени. ...

Структура-пара - C++
Поле first — дробное число; поле second — целое полож. число, показатель степени. Реализовать метод Power() — возведение числа first в...

Структура - пара - C++
Поле first — дробное положительное число, цена товара; поле second - целое положительное число, количество единиц товара. Реализовать метод...


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.07.2010, 14:29     Пара вопросов по С++ #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Стандарта под рукой нет, но со 99% уверенностью могу сказать что, const_cast может только снять константность
Из своего опыта я вывел, что в программировании нет ничего вреднее, чем основываться на недоказанных предположениях.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это печально, больше практикуйся в чтении.
Надо будет распечатать стандарт и почитывать на ночь.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не встречал, да и зачем? Это довольно таки специфический документ, чтобы его переводить.
На каком-то сайте один товарищ несколько лет назад грозился перевести, но видимо что-то у него не сложилось.
Yandex
Объявления
17.07.2010, 14:29     Пара вопросов по С++
Ответ Создать тему
Опции темы

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