Явные объявления конструкторов
Если при объявлении конструктора указать слово explicit, то он требует, чтобы значения в операторах присваивания были преобразованы к тому классовому типу, объектам которого эти значения присваиваются.
Примеробъявления класс X и его двух конструкторов:
class X {public: explicit X (int); explicit X (const char*, int=0);}; // класс X
void F(X prm) { X a=X(1); X b=X(«строка»,0); a=X(2); } // функция F
Непостоянные объявления
Если при объявлении переменной, класса или его функции указать слово volatile, то это запрещает компилятору делать предположения относительно значения указанного объекта, так как его значение может быть изменено в любой момент (фоновой задачей или обработчиком прерывания). Такие объекты повторно перезагружаются перед их использованием для чтения текущего значения.
Словом mutableможно запретить делать предположения относительно значения переменной, даже если она входит в константное выражение.
Пример непостоянного объявления переменной count:
class A // объявление класса А
{public: mutable int count; // непостоянное объявление переменной count
int F (int p=0) const // функция, у которой все переменные не изменяются
{ count=p+1; /* если убрать mutable, то была бы ошибка при компиляции:
константный объект не может быть изменен */return count;} // конец функ.
}; // конец класса
int main(int argc, char **argv) // основная функция
{ A a; cout << a.F(3) << endl; /* вывод числа 4 */ getch(); return 0; }
Быстрый вызов функций -_fastcall
Если при объявлении функции указать слово _fastcall, то компилятор значения первых трех параметров будет передавать не через стек оперативной памяти, а через процессорные регистры AX, BX, DX, что гараздо быстрее.
6.6.9. Блок обработки исключений try ‑ catch -_finally
Try
{<любой код, который может сгенерировать исключение > }
catch (T1 X1)
{ обработчик исключения X1 (п. 1.6.2) типа T1, которое было ранее сгенерировано внутри предыдущего блока try }
...
catch (Tn Xn)
{ обработчик любого исключения предыдущего блока try }
[_finally
{ < код, выполняемый при любом варианте завершения блока try> } ]
Допускается вложенность блоков try. Все объекты исключения имеют свойство Message, которое содержит текст с описанием исключения.
Пример исключения, возникающего при делении на ноль (п. 1.6.2):
void __fastcall TForm1::Button1Click(TObject *Sender) // функция
{ float a=1, b=0, c; // объявление переменных
try { c=a/b; } // блок try; при его выполнении возникнет исключение
catch (EZeroDivide &exeption)// обработка исключения EZeroDivide
{ Application->MessageBox(exeption.Message.c_str(),»Деление на ноль»,MB_ICONHAND|MB_OK); // вывод сообщения об ошибке
} // конец обработки исключения EZeroDivide (деление на ноль)
} // конец функции
Вопросы для самопроверки и контроля
Вопросы для самопроверки
1. Могут ли использоваться визуальные средства в консольных приложениях?
2. Различаются ли прописные и строчные буквы в С++?
3. Где можно указать перенос команды?
4. Можно ли присвоить начальные значения элементам массива при его объявлении?
5. Какие достоинства имеет использование перечислений (enum)?
6. Какая операция изображается в виде &&?
7. Если X=2 и Y=3+X++, то чему равны X и Y после выполнения?
8. Каково назначение оператора break?
9. Можно ли установить указатель файла на нужный байт?
10. Каково назначение конструктора класса?
11. Назначение виртуальных классов?
12. Можно ли присвоить числовое значение свойству caption?
13. Для чего предназначен блок обработки исключений try ‑ catch -_finally?
14. Что получится в результате разности дат?
Контрольные вопросы
1. Найдите ошибку в команде: char prompt [ ] = {«Ответ»}.
2. Можно ли использовать функции printf, scanf в не консольных приложениях?
3. Каково назначение оператора return?
4. Как оформляется аргумент, если его значение изменяется функцией?
5. Какая операция изображается в виде || (двух вертикальных черточек)?
6. Как изображается знак неравенства?
7. Если X=2 и Y=3+X--, то чему равны X и Y после выполнения?
8. Что означает запись вида a=*&b?
9. Каково назначение оператора continue?
10. Назначение деструктора класса?
11. Можно ли присвоить свойству Caption нетекстовое значение?
12. Что означает операция «::»?
13. Каково назначение директивы #include?
14. Что получится в результате, если к дате прибавить целое число?
Глава 7. Visual C++
В данном разделе приводятся начальные сведения по Visual C++, которые позволяют (с учетом ранее полученных знаний из предыдующих разделов данного учебника) составлять простые программы. Ограничимся кратким описанием основных управляющих элементов. Их свойства задаются в окне свойств, вызываемом командой Properties контекстного меню.
Основные общие черты Visaul C++ и C++ Builder
· Используется один язык программирования C++.
· Имеется визуальная среда быстрой разработки приложений.
· Существует много одинаковых классов и функций.
Основные отличия Visual C++ и C++ Builder
· Применяются другая библиотека классов MFC и более сложная, но гибкая технология использования классов, свойств и методов.
· При сохранении проекта создается папка с именем проекта.
· События реализуются через сообщения Windows.
· Объектам (полям ввода‑вывода, счетчикам) сопоставляются (назначаются) переменные, которые содержат значения этих объектов. Для передачи текущих значений объектов в эти переменные используется функция UpdateData(1) (UpdateData(); V=m_edit1) или DDX_<управляющий элемент> (DDX_Text(pDX, IDC_EDIT1, m_edit1)). Для инициализации объектов с использованием значений этих переменных (обратная операция по обновлению объектов на форме) применяется функция UpdateData(0) (m_edit1=«Иванов»; UpdateData(0);) или SetDlgItemText (<имя элемента>,<значение>) (SetDlgItemText (IDC_EDIT2, m_cpicok)).
· Объекту, включенному командой Insert ActiveX Control контекстного меню, назначается объектная (Category Control) переменная. Значение свойства объекта устанавливается/читается методом Set<имя свойства>(<значение>)/Get<имя свойства>().
Пример использования свойства Caption ActiveX‑элемента Label (Microsoft Forms 2.0 Label):
CString m1;//объявление переменной, m_label1 ‑ объектная переменная
m1=m_label1.GetCaption(); //m1=значение свойства Caption объекта Label1
m_label1.SetCaption("Фамилия"); //установка значения свойства Caption
Дата добавления: 2016-03-22; просмотров: 562;