    В C++ сильно ослаблена потребность в typedef-объявлениях. Вы можете 
объявить структуру типа 

    struct mystruct { 
    } ;

и затем объявлять переменные как mystruct x;. Чтобы проделать нечто 
подобное в ANSI С, вы должны написать struct mystruct x; или использовать 
typedef для структуры mystruct. 


    В ANSI С символьные константы имеют тип int, и выражение sizeof('X') 
эквивалентно sizeof(int). В C++ символьные константы имеют тип char, и 
выражение sizeof('X') соответствует sizeof(char). 

    C++ дополнил комментарии ANSI С новым стилем, воскрешенным из BCPL — 
предшественника классического С. В программах C++ двойная косая начинает 
комментарий. Компилятор игнорирует все символы после / / до конца строки. В 

/• 
    cout « '\n';	// Начать новую строку для отображения 
•/ 

    cout.put(c); 
    cout.put(с); 
    cin.get(c); 
    cin.good()
    cin.clear(); 
    cin.get(s, 25, '\n'); 
    cin.getline(buffer, 25); 
    cout.width(15);	// Указать вывод в 15 позициях

      ::count = 4321;     // Присвоить значение глобальной переменной count

    const int count =1234; 
 Компилятор выдаст сообщение об ошибке в операторе 
    count++;	// ??? 

    3:  inline int max(int a,   int b) 
    4:         { 
    5:            if (a >= b) 
    6:                 return a; 
    7:             else 
    8:                return b; 
    9:          } 


    double *dp = new double; 

    double *dp = new(double); 

    delete dp; 


    Чтобы new возвращал нуль в случае ошибки, программа передает 0 функции 
    Для этого включите заголовочный файл NEW.H в вашу программу и добавьте 
следующий оператор в main() или в любое другое место до первого использования new: 

    set_new_handleг(0); 


Повторное удаление указателя, как это произошло в последнем операторе, — также серьезная ошибка, 
так как это может повредить кучу, дважды добавив один и тот же блок памяти в 
список свободного пространства в этой области. Обязательное правило — удалив 
указатель, никогда не используйте его повторно ни для каких целей.


    8:	  char *sp
    9:	  sp = new char[SIZE];
    13:	  delete[]	sp;


    Строка 13 удаляет динамический символьный массив. Borland C++ разрешает
написать этот оператор без скобок следующим образом:

    delete sp; // ???, но безопасно в Borland C++

    Следуя более строгому протоколу C++, необходимо использовать пустые скобки
в выражении delete[], указывающие компилятору, что удаляется массив, а не
простая переменная. (В Borland C++ скобки необходимы только в том случае, если
удаляется массив классовых объектов, но об этом позже.)
    В ранних версиях C++ при удалении массива нужно было указывать количество
элементов. В C++ версии 2.0, например, строка 15 имела бы вид delete(SIZE]
sp;. Borland C++ игнорирует SIZE в таком случае и выдает предупреждение о
попытке использовать устаревшую форму delete.


     3:     #define COUNT 100 // Количество целых значений
    10:     array = new int[COUNT];
    21:     delete[] array;


    int (*matrix)[20]; 
    Оно определяет matrix, как указатель на массив из 20 целых. Вы должны 
заключить в круглые скобки (*matrix), поскольку квадратные скобки массива 
имеют больший приоритет, чем символ указателя *. 
Чтобы выделить память для матрицы 
размером 10x20 и присвоить ее адрес переменной matrix, следует написать такой оператор: 

    matrix = new int[10][20]; 


    int (*matrix)[8][8]; 
    matrix = new int[8][8][8]; 

    При выделении пространства для многомерного массива первый индекс может 
быть переменной, а второй и последующие должны быть константами. Например, 
если целая переменная v равна 40, то следующие строки 

    int (*matrix)[20]; 
    matrix = new int[v][20]; 

Удаление многомерных массивов любой 
размерности происходит так, как будто они имеют лишь одно измерение: 

    delete[] matrix; 


    Draw(ellipse); 
    Draw(circle); 
    Draw(square); 
    Draw(line); 
    Подобной ясности в программах можно добиться, используя перегрузку 
функций. В C++ многочисленные функции могут иметь одинаковое имя до тех пор, 
пока они отличаются хотя бы одним параметром. Функции "перегружены", по


дополняют необходимые значения для незаданных аргументов. Для объявлени
значения аргумента по умолчанию в прототипе функции завершите параметр функции
знаком равенства и необходимым значением:
    int sum(int a,  int b,  int с = 0,  int d = 0);
Значения по умолчанию должны идти последними в списке параметров функции и могут 
появляться только в прототипе функции. Если не указаны аргументы для с и d, то они 
замещаются значениями по


    C++ предлагает альтернативу для более безопасного доступа к переменным 
через указатели. Объявив ссылочную переменную, вы создадите объект, который, 
как указатель, ссылается на другое значение, но, в отличие от указателя, 
постоянно привязан к своему alter ego ("второму я"). Ссылка на значение всегда 
ссылается на это значение.
    Ссылки, в основном, используются в качестве переменных, параметров функций 
и результатов функций. 
    Как переменная ссылка ссылается на другое значение. Вероятно, на практике 
вы не захотите использовать ссылки таким образом, но приведенная ниже 
    При использовании ссылок следует помнить одно правило: однажды 
инициализировав ссылку, ей нельзя присвоить другое значение. В REFVAL.CPP вы 
    Как следует из вышесказанного, ссылки должны быть инициализированы при их 
объявлении. Строка 7, к примеру, не может быть написана Как 
    int &iref;       // ??? 
    В отличие от указателей, которые могут быть объявлены в 
неинициализированном состоянии или установлены в нуль (если указатель не 
ссылается на необходимые данные), ссылки всегда ссылаются на объект. Для 
ссылок не существует аналога нулевого указателя. 

    Ссылки нельзя инициализировать значениями в следующих четырех особых 

    Несмотря на интригующие свойства, сами по себе ссылочные переменные 
используются довольно редко. Вместо того чтобы использовать ссылку для доступа 
к другой переменной, легче использовать саму эту переменную. 

    Некоторые критикуют передачу параметров функций gj ссылке, верно замечая, 
что такие вызовы выглядят обманчиво, поскольку аргументы в них передаются по 
ссылке неявно.
    Аргументы, передающиеся по значению, невозможно отличить от аргументов, 
передающихся по ссылке.
    void f(int *ip) 
    *ip = 1234; 

    void f(int &ir) 
    ir = 1234; 

    f(ivar);   // Передача ivar по ссылке 

    Листинг 12.17 демонстрирует использование ссылочных функций для скрытия 
внутреннего представления структуры данных. Это используется при реализации 

    10:	double &ref(int index); 
    11:	void ShowArray(void); 
    12: 
    13:	double array[SIZE]; 
    14: 
    15:	main() 
    16:	{ 
    17:	int done = FALSE, index; 
    18:	char buffer[BUFLEN]; 
    19: 
    20:	for (index = 0; index < SIZE; index++) 
    21:	   ref(index) = index; // Присваивание ссылочной функции! 

    37:	double &ref(int index) 
    38:	{ 
    39:	  if ((index < 0) | | (index >= SIZE)) 
    40:	    index = 0; 
    41:	  return array[index]; //	Вернуть ссылку на элемент массива 
    42:	} 

   • Ссылка, объявленная с помощью &, ссылается на объект. В отличие от 
указателей, которые также могут ссылаться на объект, ссылка должна быть 
инициализирована при объявлении (за исключением отдельных случаев), и не может 
ссылаться в дальнейшем ни на какой другой объект. 
   • Ссылки обычно используются для объявления параметров функции, которые 
ссылаются на фактические аргументы, переданные в эту функцию. Таким образом, 
ссылки похожи на параметры-указатели, но они проще в использовании. Кроме 
того, иногда ссылки применяются в качестве возвращаемого значения функции. Это 
можно использовать при скрытии деталей реализации внутренней структуры данных, 
что позволяет проводить в ней изменения без соответствующих исправлений в коде. 
