Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Программирование » Справочное руководство по C++ - Бьярн Страустрап

Справочное руководство по C++ - Бьярн Страустрап

Читать онлайн Справочное руководство по C++ - Бьярн Страустрап

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 32 33 34 35 36 37 38 39 40 41
Перейти на страницу:

Можно присваивать объекту типа перечисления значение типа int.

При удалении массива, тип которого не имеет деструктора, можно указывать число элементов; §R.5.3.4.

Одна функция operator++() может использоваться для перегрузки как префиксных, так и постфиксных операций ++; тоже верно для операции --;  §R.13.4.6.

R.18.3.1 Определения функций старого стиля

Можно использовать синтаксис С для определений функций:

старое-определение-функции:

 спецификации-описаний opt старый-описатель-функции

 список-описаний opt тело-функции

старый-описатель-функции:

 описатель ( список-параметров opt )

список-параметров:

 идентификатор

 список-параметров , идентификатор

Приведем пример:

max(a,b) int b; { return (a‹b) ? b : a; }

Если определенная таким образом функция не была описана ранее, то тип ее формальных параметров полагается (…), т.е. он не будет проверяться.

Если она была описана, то тип должен согласовываться с типом, указанным в описании.

Приведенный синтаксис нельзя использовать для определения функций-членов.

R.18.3.2 Старый стиль задания инициализатора базового класса

В конструкции инициализатор-памяти (§R.12.6.2) можно не указывать имя-класса, обозначающее базовый класс при условии, что существует только один прямой (непосредственный) базовый класс. Поэтому в описании

class B {

 //…

public:

 B(int);

};

class D: public B {

 //…

 D(int i): (i) {/*… */}

};

будет вызываться конструктор B с параметром i.

R.18.3.3 Присваивание указателю this

Присваивая определенные значения указателю this, пользователь мог управлять выделением памяти для объекта некоторого класса. В конструкторе до использования членов класса можно было с помощью такого присваивания реализовать свой алгоритм выделения памяти. Присваивая в деструкторе указателю this нуль, можно было обойти стандартную операцию освобождения объектов класса. Кроме того, присваивание нуля в деструкторе отменяло неявные вызовы деструкторов для членов и базовых классов, например:

class Z {

 int z[10];

 Z() { this = my_allocator(sizeof(Z)); }

 ~Z() { my_deallocator(this); this = 0; }

};

Если выделение памяти уже произошло (как бывает для членов и объектов auto или static), то при входе в конструктор this имеет ненулевое значение и значение нуль в противном случае.

Вызовы конструкторов для членов и базовых классов произойдут только после того, как this получил значение. Если в конструкторе базового класса есть присваивание this, то новое значение this будет использоваться и в конструкторах производных классов, если они есть.

Отметим, что при наличии указанного анахронизма или тип указателя this не может быть *const, или нужно делать исключение для this из правила о присваивании указателям со спецификацией const.

R.18.3.4 Приведение указателей на функцию-член

Указатель на функцию-член некоторого объекта можно привести к указателю на какую-то другую функцию, например (int (*) ())p-›f. Результирующий указатель будет настроен на функцию, вызов которой будет происходить с помощью обращения к этой функции-члену для того же объекта. Как обычно результат такого вызова считается неопределенным.

R.18.3.5 Невложенность классов

Если класс описан внутри другого класса и в программе больше не описано классов с этим именем, то его можно использовать, как если бы он был описан вне класса (так обстоит дело с описанием struct в С), например:

struct S {

 struct T {

  int a;

 };

 int b;

};

struct T x; // означает `S::T x;'

Список служебных слов

auto автоматический

break разрыв

case вариант

catch перехватить

char символ

class класс

const конст

continue продолжить

default по умолчанию

delete удалить

do делать

double двойной

else иначе

enum перечисление

extern внешний

float плавающий

for для

friend друг

goto переход на

if если

inline подстановка

int целый

long длинный

new новый

operator оператор

private частный

protected защищенный

public общий

register регистровый

return возврат

short короткий

signed знаковый

sizeof размер

static статический

struct структура

switch переключатель

template шаблон типа

this текущий

throw запустить

try проверить

typedef тип

union объединение

unsigned беззнаковый

virtual виртуальный

void пустой

volatile изменяемый

while пока

* ПРИМЕРЫ *

b1_1_1.cxx

#include ‹stream.hxx›

main()

{

 cout ‹‹ "Hello, worldn";

}

b1_1_3.cxx

#include ‹stream.hxx›

main ()

{

 int inch = 0;

 cout ‹‹ "inches=";

 cin ›› inch;

 cout ‹‹ inch;

 cout ‹‹ "in = ";

 cout ‹‹ inch*2.54;

 cout ‹‹ " cmn";

}

b1_4_5v.cxx

#include ‹stream.hxx›

main()

{

 const float fac = 2.54;

 float x, in, cm;

 char ch = 0;

 for (int i= 0; i‹ 8; i++) {

  cerr ‹‹ "enter length: ";

  cin ›› x ›› ch;

  if (ch == 'i') {// inch

   in = x;

   cm = x*fac;

  }

  else if (ch == 'c') {// cm

   in = x/fac;

   cm = x;

  }

  else

   in = cm = 0;

   cerr ‹‹ in ‹‹ "in = " ‹‹ cm ‹‹ " cmn";

 }

}

b1_5.cxx

#include ‹stream.hxx›

extern float pow(float, int);

main()

{

 for (int i=0; i‹10; i++) cout ‹‹ pow(2,i) ‹‹ "n";

}

extern void error(char *);

float pow(float x, int n)

{

 if (n ‹ 0) {

  error ("sorry, negative exponent to pow()");

  return 0;

 }

 switch (n) {

 case 0: return 1;

 case 1: return x;

 default: return x*pow(x,n-1);

 }

}

void error(char *s)

{

 cout ‹‹ s;

}

b1__13.cxx

#include ‹stream.hxx›

// 1.11

class vector {

 int *v;

 int sz;

public:

 vector(int); // constructor

 ~vector(); // destructor

 int size() { return sz; }

 void set_size(int);

 int& operator[](int);

 int& elem(int i) { return v[i]; }

};

// 1.13

class vec: public vector {

 int low, high;

public:

 vec(int, int);

 int& elem(int);

 int& operator[](int);

};

main()

{

 vector a(10);

 for (int i=0; i‹a.size(); i++) {

  a[i] = i;

  cout ‹‹ a[i] ‹‹ " ";

 }

 cout ‹‹ "n";

 vec b(10,19);

 for (i=0; i‹b.size(); i++) b[i+10] = a[i];

 for (i=0; i‹b.size(); i++) cout ‹‹ b[i+10] ‹‹ " ";

 cout ‹‹ "n";

}

extern void exit(int);

// 1.13

void error(char* p)

{

 cerr ‹‹ p ‹‹ "n";

 exit (1);

}

// 1.11

vector::vector(int s)

{

 if (s‹=0) error("bad vector size");

 sz = s;

 v = new int[s];

}

int& vector::operator[](int i)

{

 if (i‹0 || sz‹=i) error("vector index out of range");

 return v[i];

}

vector::~vector()

{

 delete v;

}

// 1.13

int& vec::elem(int i)

{

 return vector::elem(i-low);

}

vec::vec(int lb, int hb): (hb-lb+1)

{

 if (hb-lb‹0) hb = lb;

 low = lb;

 high = hb;

}

void vector::set_size(int) {/* dummy */}

int& vec::operator[](int i)

{

 if (i‹low || high‹i) error("vec index out of range");

 return elem(i);

}

b1__14.cxx

#include‹stream.hxx›

extern void exit(int);

extern void error(char*);

// 1.11

class vector {

 int *v;

 int sz;

public:

 vector(int); // constructor

 ~vector(); // destructor

1 ... 32 33 34 35 36 37 38 39 40 41
Перейти на страницу:
На этой странице вы можете бесплатно скачать Справочное руководство по C++ - Бьярн Страустрап торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит