Некоторые особенности компоновки.
Имя, объявленное в области видимости файла, как static, является локальным и скрыто от других файлов. Так же ведут себя функции, объявленные inline и переменные с модификатором const. Переменные const, находящиеся в области видимости файла, но не являющиеся статической, может быть задан внешний тип компоновки с помощью объявления ее extern.
Программы на Си++ могут компоноваться с программами на Си на Паскале, в зависимости от реализации.
Пространство имен.
Си++ унаследовал от Си единое пространство имен. Возникающие из-за этого конфликты привели к появлению в Си++ области видимости пространства имен.
Namespace LMPinc
{
class purrles{…};
class toys{…};
. . . .
}
Идентификатор пространства имен может быть использован, как часть идентификатора, разрешающего область видимости. Идентификатор_пространства_имен :: идентификатор
Существуют также объявление using, которое позволяет получить доступ ко всем именам из пространства имен.
using namespace LMPinc;
toys top; //используется LMPinc :: toys
Пространства имен могут быть вложенными.
namespase LMPout
{
int n;
namespace LMPin
{
int sq()
{
return n*n;
} //LMPout :: n
void pr_mu_logo():
}
void LMPin :: pr_mu_logo()
{
cout<<”LMPinc”<<eldl;
}
}
Вместо глобальных статических переменных может использоваться безымянное пространство имен. Например,
Namespace
{
int count=0;
} //здесь count уникальный.
// count доступна в остальной части файла
void chg_cnt(int i)
{
count=i;
}
Перечислимые типы.
Ключевое слово enum используется для объявления особого целого типа с набором именованных целых констант, называемых константами перечислимого типа или перечислимыми константами.
enum suit {clubs, diamonds, hearts, spides};
0 1 2 3
по умолчанию
Перечислимые константы могут быть инициализированы произвольными целыми константами, а также целыми выражениями
enum ages {laura=7, ira=8, harold=59, philip=harold+7};
66
Теговые имена и имена перечислимых констант должны быть уникальны в пределах области видимости.
Перечислимые константы могут быть преобразованы к обычному целому типу, но не наоборот.
enum signal {off,on}a=on; //a присвоено значение on=1
enum answer {no, yes, maybe=-1}b;
enum negative {no, false}c; //недопустимо no и false переобъяв- лены
int i, j=on; //допустимо
a=off; //допустимо
i=a; //допустимо
b=a; // недопустимо, разные типы
b=static_cast<answer>(a); //допустимо
b=(a? No : yes);
Типы указателей.
Указатели в Си++ используются для связи переменных с «машинными» адресами.
Если v – переменная, то &v – это адрес, или место в памяти, где хранится ее значение.
Пример объявления указателя на целое
Int*p;
Допустимая область значений:
специальный адрес 0 (обычно для указания ошибки)
положительные целые числа, которые интерпретируются как машинные адреса в зависимости от конкретной системы.
Примеры присваивания значений.
p=&i; // адрес объекта i
p=0; // нулевое значение
p=static_cast<int*> (1507); // абсолютный адрес
/* об'явление, инициализация и разыменовывание указателя */
#include <stdio.h>
char c; /* Символьная переменная */
main()
{
char *pc; /* Указатель на символьную переменную */
pc = &c;
for (c = 'A'; c <= 'Z'; c++)
printf("%c", *pc);
return 0;
}