Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> code style, механизм исключений и др. вопросы, возникшие при изучении C++ 
:(
    Опции темы
wowka19
Дата 17.7.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



1. Почему не рекомендуется обозначать приоритеты при помощи пробелов: 4 + 3*2 - 34/9 ? (Джесс Либерти)
2. Чем является имя массива - ссылкой или указателем на 1й элемент? А имя объекта?
3. В одной книжке увидел код:

Код

int& Array::operator[](int offSet)
{
    int size = GetSize();
    if (offSet >= 0 && offSet < size)
        return pType[offSet];
    throw xBoundary();
    return pType[offSet];
}


const int& Array::operator[](int offSet) const
{
    int size = GetSize();
    if (offSet >= 0 && offSet < size)
        return pType[offSet];
    throw xBoundary();
    return pType[offSet];
}


Вопросы:
а - зачем возврат после передачи исключения?
б - как компилятор выбирает какой метод использовать если они одинаковые? какой смысл в таком дубликате?

4. Если я правильно понимаю, то при срабатывании исключения стек вызова прокручивается обратно, пока объект искючения не найдет обработчик (то есть блок CATCH).
Вопрос: каким образом объект найдет обработчик, если его еще нет в стеке вызова так как блок CATCH находится ПОСЛЕ try? Вроде как в callstack попадают уже вызванные функции, но к функциям блока try еще не было обращений.

Это сообщение отредактировал(а) wowka19 - 17.7.2012, 11:48
PM MAIL   Вверх
bsa
Дата 17.7.2012, 12:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



1. потому что пробелы компилятору не говорят о приоритетах. Поэтому, ты можешь написать 1+2 * 3 и получить не то, что ожидаешь. Все программисты знают приоритеты базовых математических операций. Поэтому, их отдельно обозначать не надо. Другое дело логические, побитовые и пр. Их лучше всегда явно указывать скобками. Так как не каждый их знает наизусть. И вообще, gcc ругается на выражения a || b && c. Так как не все видят, что выполняется оно справа на лево.
2. имя массива не является ни тем, ни другим. имя объекта тоже. Имя - это имя. Другое дело, что в месте использования переменная-массив может быть преобразована в указатель на первый его элемент. В то же время, переменная-объект может быть "преобразована" в ссылку (точнее, для нее автоматически создана ссылка, если это требуется функции, например).
3. а) скорее всего, таким образом просто было отключено предупреждение об отсутствии возвращаемого значения. Но возможно, автор хотел сначала поместить throw под if (с инверсным условием, конечно), а затем передумал, но не подчистил код. б) методы не одинаковые. Если у тебя в данном месте есть возможность менять состояние объекта Array, то он выберет первый вариант, а если нет, то второй.
4. я не знаю реального механизма работы исключений, но подозреваю, что при входе в каждый блок try выставляется в стеке метка об этом, когда идет разворачивание стека, и встречается эта метка, то проверяется, подходит ли кинутое исключение под отлавливаемое блоком catch. Если подходит, то он начинает его выполнение, если нет, то происходит продолжение раскрутки. А то что блок catch стоит после try тебя вообще не должно никак заботить. Тебя же не смущает, что в операторе for третья операция (после второй точки с запятой) выполняется после основного блока цикла? А try/catch это аналог if (true){A}else{B}, только с возможностью попасть в блок {B} из любого места блока {A} (в т.ч. и из вызванных функций).
PM   Вверх
wowka19
Дата 17.7.2012, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



по 1 и 2 вроде понятно.
по 3:
то есть:

Код

Array A(10);
const Array B(10);

A[2]; // вернет int
B[2]; // вернет const int


и:
Код


Array A(10);

int a = A[2];       // вернет int
const int b = A[2]; // вернет тоже int


так?


4.
Понятно, что try/catch некоторая интерпретация(модификация) if/goto. 
Если я правильно понял - catch не обязательно должен стоять после try? И его (catch) можно засунуть намного раньше (ПЕРЕД) первого try, чтобы в случае срабатывания исключения стек раскрутился от try до catch, попутно разрушая все созданные объекты?

Это сообщение отредактировал(а) wowka19 - 17.7.2012, 13:31
PM MAIL   Вверх
xvr
Дата 17.7.2012, 13:55 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(wowka19 @  17.7.2012,  13:28 Найти цитируемый пост)
Если я правильно понял - catch не обязательно должен стоять после try?

Нет. try { ...} catch() {} - это такая конструкция языка (причем это одна конструкция, а не две). catch не может быть использован без try перед ним

PM MAIL   Вверх
borisbn
Дата 17.7.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(wowka19 @  17.7.2012,  13:28 Найти цитируемый пост)
A[2]; // вернет int
B[2]; // вернет const int

Вернёт ссылку на int. Во втором случае константную ссылку, а в первом - обычную.
Разница в том, что ты можешь написать так
Код
A[ 2 ] = 42;

и во второй элемент массива запишется 42
а вот так
Код
B[ 2 ] = 42;

ты сделать не сможешь (компилятор не даст)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wowka19
Дата 21.7.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



borisbn

Наскоько я знаю - const не дает изменить переменную. Тогда зачем явно прописывать const int& Array::operator[](int offSet) const? Разве без этого дубликата компилятор позволит изменение объекта (B[ 2 ] = 42)?
PM MAIL   Вверх
borisbn
Дата 21.7.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(wowka19 @  21.7.2012,  13:02 Найти цитируемый пост)
Разве без этого дубликата компилятор позволит изменение объекта (B[ 2 ] = 42)

позволит. кста, ведь довольно просто проверить... зачем для этого задавать вопрос на форуме ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wowka19
Дата 21.7.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  21.7.2012,  13:19 Найти цитируемый пост)
Цитата(wowka19 @  21.7.2012,  13:02 Найти цитируемый пост)
Разве без этого дубликата компилятор позволит изменение объекта (B[ 2 ] = 42)

позволит. кста, ведь довольно просто проверить... зачем для этого задавать вопрос на форуме ?


borisbn,  проверил. Итог - НЕ позволит.

Он даже не даст вызвать B[2], так как operator[]() не является const-методом, а не const-методы у const-объекта компилятор вызвать не позволит.

Вроде разобрался;)
PM MAIL   Вверх
borisbn
Дата 21.7.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



уууупс. не обратил внимание, что B объявлен как
Цитата(wowka19 @  17.7.2012,  13:28 Найти цитируемый пост)
const Array B

тогда да. не позволит



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
alsav22
Дата 22.7.2012, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 13.4.2012

Репутация: нет
Всего: нет



Цитата

переменная-массив может быть преобразована в указатель на первый его элемент
 Небольшое уточнение. Имя массива не просто указатель, а константный указатель, кроме случая, когда массив является параметром функции. Тогда это просто указатель.
PM MAIL   Вверх
bsa
Дата 22.7.2012, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(alsav22 @  22.7.2012,  03:34 Найти цитируемый пост)
Небольшое уточнение.
lvalue всегда константно. Так как оно существует временно (т.е. нет постоянного места хранения в памяти). А при использовании массива происходит преобразование объекта "массив" в указатель на первый его элемент. В случае передачи в функцию происходит создание локальной переменной, которой присваивается данный указатель. Именно поэтому, "его" можно менять. А на самом деле, меняется локальная переменная вызванной функции. Поэтому, не стоит путать людей.

PM   Вверх
alsav22
Дата 23.7.2012, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 13.4.2012

Репутация: нет
Всего: нет



Цитата
 А при использовании массива происходит преобразование объекта "массив" в указатель на первый его элемент
 В неконстантный указатель? И ещё вопрос. Вот вы пишите, что lvalue всегда константно. Чем же тогда отличается lvalue от  non-modifiable lvalue?

Это сообщение отредактировал(а) alsav22 - 23.7.2012, 01:29
PM MAIL   Вверх
borisbn
Дата 23.7.2012, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(alsav22 @  23.7.2012,  00:19 Найти цитируемый пост)
 В неконстантный указатель?

зависит от объявления этого указателя.
Код
void foo( char * ptr ); // НЕ константный
void foo( const char * ptr ); // константный


Цитата(alsav22 @  23.7.2012,  00:19 Найти цитируемый пост)
Вот вы пишите, что lvalue всегда константно. Чем же тогда отличается lvalue от  non-modifiable lvalue?

bsa, имел в виду rvalue


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 23.7.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(borisbn @  23.7.2012,  09:16 Найти цитируемый пост)
bsa, имел в виду rvalue 
точно. главное, сижу, туплю в монитор. Думаю, что-то тут не то. Но так и не допер... Спать видимо пора была.  smile 

PM   Вверх
alsav22
Дата 23.7.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 13.4.2012

Репутация: нет
Всего: нет



Цитата

зависит от объявления этого указателя.код C++
void foo( char * ptr ); // НЕ константный
void foo( const char * ptr ); // константный
Это понятно. 
Цитата

bsa, имел в виду rvalue
Разговор идёт об имени массива, и причём здесь тогда rvalue? Потом, если bsa, имел в виду rvalue и оно, как он сказал, 
Цитата

всегда константно
, то тут, вообще, не понятно. В чём смысл тогда  lvalue-to-rvalue conversion, в частности, имени массива, если не в том, чтобы изменять rvalue?

Это сообщение отредактировал(а) alsav22 - 23.7.2012, 20:08
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.