Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Операторы throw без параметров ⇐ ПредыдущаяСтр 10 из 10
Итак, мы увидели, как новый метод обработки ошибок удобен и прост. Блок try-catch может содержать вложенные блоки try-catch и если не будет определено соответствующего оператора catch на текущем уровен вложения, исключение будет поймано на более высоком уровне. Единственная вещь, о которой вы должны помнить, - это то, что операторы, следующие за throw, никогда не выполнятся. try{ throw; // ни один оператор, следующий далее (до закрывающей скобки) // выполнен не будет}catch(...){ cout < < " Исключение! " < < endl; }Такой метод может применяться в случаях, когда не нужно передавать никаких данных в блок catch. Приложение Приведем пример, как все вышеизложенное может быть использовано в конкретном приложении. Преположим, у вас в программе есть класс cMain и экземпляр этого класса Main: class cMain { public: bool Setup(); bool Loop(); // Основной цикл программы void Close(); }; cMain Main; А в функции main() или WinMain() вы можете использовать этот класс как-нибудь так: try{ Main.Setup(); Main.Loop(); Main.Close(); }catch (Exception & e){ // использование класса, ведущего лог. log(" Exception thrown: %s", e.String()); // Показываем сообщение об ошибке и закрываем приложение.}Основной цикл программы может выглядеть примерно так: while (AppActive){ try { // какие-то действия } catch (Exception & e) { /* Если исключение критическое, типа ошибки памяти, посылаем исключение дальше, в main(), оператором throw e; или просто throw. Если исключение некритично, обрабатываем его и возвращаемся в основной цикл. */ }}Заключение Метод обработки исключений, приведенный в статье, является удобным и мощным средством, однако только вам решать, использовать его или нет. Одно можно скачать точно - приведенный метод облегчит вам жизнь. БИЛЕТ №24 В C++ существует явное приведение типов и автоматическое (или неявное). Явное приведение осуществляется с помощью указания целевого типа данных (того, к которому нужно привести) в круглых скобках перед выражением: double s = 2.71; int t = (int) s; cout < < t < < endl; // 2 cout < < (int) 3.14 < < endl; // 3 cout < < (int) (2.5 + t) < < endl; // 4 Приведение к целым числам от вещественных осуществляется путём отбрасывания целой части (не округлением). В C++ к тому же возможно приведение между логическим и числовыми типами. Любое ненулевое число приводится к true, число 0 или 0.0 — к false. И, наоборот, false преобразуется в 0, а true — в 1. bool b = true; int t = (int) b; cout < < t < < endl; // 1 cout < < (int) false < < endl; // 0 bool n = (bool) 42; // true bool m = (bool) (5 * 2 - 10); // false bool k = (bool) 0.43; // true double num1 = 2 + (double) (k || m); // 3.0 Автоматическое приведение возможно в том случае, когда значение преобразуется к более широкому типу, например, целое число к вещественному. Аналогичные преобразования доступны на языке JAVA. Операторы приведения типов c++: dynamic_cast, const_cast, reinterpret_cast, static_cast. Эти операторы позволяют контролировать процессы приведения типов. dynamic_cast осуществляет динамическое приведение типа с последующей проверкой корректности приведения. Общий вид: dynamic_cast < target_type> (expr); Здесь параметр target_type задаёт результирующий тип, а параметр expr – выражение, которое приводится к новому типу. Результирующий тип должен быть указательным или ссылочным, а приводимое выражение – вычислять указатель или ссылку. Оператор dynamic_cast предназначен для приведения полиморфных типов. Оператор const_cast используется для явного замещения модификаторов const и/или volatile. Результирующий тип должен совпадать с исходным, за исключением атрибутов const и volatile. Чаще всего оператор const_castприменяется для удаления модификатора const. Общий вид оператора const_cast приведён ниже. const_cast < type> (expr) Оператор static_cast выполняет неполиморфное приведение. Его можно применять для любого стандартного преобразования типов. Проверка приведения в ходе выполнения программы не производиться. static_cast< tipe> (expr); Оператор reinterpret_cast преобразует один тип в совершенно другой. Например, он может преобразовывать указатель на целое число в целое число, а целое число – в указатель. Его можно использовать для приведения несовместимых типов указателей. Оператор reinterpret_cast имеет вид. reinterpret_cast< type> (expr) БИЛЕТ №25 Перечислимые Типы Перечислимый тип является типом, поля которого состоят из фиксированного набора констант. Типичные примеры включают направления компаса (значения СЕВЕРА, ЮГА, ВОСТОКА, и ЗАПАДА) и дни недели. Поскольку они - константы, имена полей перечислимого типа находятся в прописных буквах. В языке программирования Java Вы определяете перечислимый тип при использовании enum ключевое слово. Например, Вы определили бы перечислимый тип " дни недели" как:
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } Следует использовать типы перечисления любое время, Вы должны представить фиксированный набор констант. Это включает естественные перечислимые типы, такие как планеты в нашей солнечной системе и наборах данных, где Вы знаете все возможные значения во время компиляции — например, варианты в меню, флагах командной строки, и так далее. Вот некоторый код, который показывает Вам, как использовать Day перечисление, определенное выше:
public class EnumTest { Day day;
public EnumTest(Day day) { this.day = day; }
public void tellItLikeItIs() { switch (day) { case MONDAY: System.out.println(" Mondays are bad." ); break;
case FRIDAY: System.out.println(" Fridays are better." ); break;
case SATURDAY: case SUNDAY: System.out.println(" Weekends are best." ); break;
default: System.out.println(" Midweek days are so-so." ); break; } }
public static void main(String[] args) { EnumTest firstDay = new EnumTest(Day.MONDAY); firstDay.tellItLikeItIs(); EnumTest thirdDay = new EnumTest(Day.WEDNESDAY); thirdDay.tellItLikeItIs(); EnumTest fifthDay = new EnumTest(Day.FRIDAY); fifthDay.tellItLikeItIs(); EnumTest sixthDay = new EnumTest(Day.SATURDAY); sixthDay.tellItLikeItIs(); EnumTest seventhDay = new EnumTest(Day.SUNDAY); seventhDay.tellItLikeItIs(); } } Вывод: Mondays are bad. Midweek days are so-so. Fridays are better. Weekends are best. Weekends are best. Типы перечисления языка программирования Java намного более мощны чем их дубликаты на других языках. enum объявление определяет class (названный перечислимым типом). Перечислимое тело class может включать методы и другие поля. Компилятор автоматически добавляет некоторые специальные методы, когда он создает перечисление. Например, у них есть помехи values метод, который возвращает массив, содержащий все значения перечисления в порядке, которым они объявляются. Этот метод обычно используется в комбинации с для - каждая конструкция, чтобы выполнить итерации по значениям перечислимого типа. Например, этот код от Planet Пример class ниже выполняет итерации по всем планетам в солнечной системе. for (Planet p: Planet.values()) { System.out.printf(" Your weight on %s is %f%n", p, p.surfaceWeight(mass)); } Отметьте: Все перечисления неявно расширяются java.lang.Enum. Так как Java не поддерживает множественное наследование, перечисление не может расширить ничто больше. В следующем примере, Planet перечислимый тип, который представляет планеты в солнечной системе. Они определяются с помощью постоянной массы и свойств радиуса. Каждая перечислимая константа объявляется со значениями для параметров радиуса и массы. Эти значения передают конструктору, когда константа создается. Java требует, чтобы константы были определены сначала до любых полей или методов. Кроме того, когда есть поля и методы, список перечислимых констант должен закончиться точкой с запятой. Отметьте: конструктор для перечислимого типа должен быть частным на пакет или частным доступом. Это автоматически создает константы, которые определяются в начале перечислимого тела. Невозможно вызвать перечислимого конструктора самостоятельно. В дополнение к его свойствам и конструктору, Planet имеет методы, которые позволяют Вам получать поверхностную силу тяжести и вес объекта на каждой планете. Вот пример программы, который берет Ваш вес на земле (в любом модуле) и вычисляет и печатает Ваш вес на всех планетах (в том же самом модуле):
public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.0268e7), URANUS (8.686e+25, 2.5559e7), NEPTUNE (1.024e+26, 2.4746e7);
private final double mass; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } private double mass() { return mass; } private double radius() { return radius; }
// universal gravitational constant (m3 kg-1 s-2) public static final double G = 6.67300E-11;
double surfaceGravity() { return G * mass / (radius * radius); } double surfaceWeight(double otherMass) { return otherMass * surfaceGravity(); } public static void main(String[] args) { if (args.length! = 1) { System.err.println(" Usage: java Planet < earth_weight> " ); System.exit(-1); } double earthWeight = Double.parseDouble(args[0]); double mass = earthWeight/EARTH.surfaceGravity(); for (Planet p: Planet.values()) System.out.printf(" Your weight on %s is %f%n", p, p.surfaceWeight(mass)); } } Популярное:
|
Последнее изменение этой страницы: 2016-07-14; Просмотров: 897; Нарушение авторского права страницы