C++ Модификаторы типа
C++ позволяет размещать модификаторы перед типами данныхchar, int и double.
Модификаторы — это ключевые слова, используемые для изменения поведения типов переменных, что лучше отвечает потребностям различных ситуаций.
Модификаторы типов данных перечислены ниже:
signed: указывает, что переменная может хранить отрицательные числа. Для целочисленных переменных signed можно опустить, поскольку целочисленные переменные по умолчанию являются signed.
unsigned: указывает, что переменная не может хранить отрицательные числа. Для целочисленных переменных unsigned может удвоить диапазон переменной.
short: указывает, что переменная имеет меньший диапазон, чем int. short int можно сократить до short.
long: указывает, что переменная имеет больший диапазон, чем int. long int можно сократить до long.
long long: указывает, что переменная имеет больший диапазон, чем long. Модификатор типа данных, добавленный в C++11.
float: представляет число с плавающей запятой одинарной точности.
double: представляет число с плавающей запятой двойной точности.
bool: представляет логический тип, который имеет только два значения: true и false.
char: обозначает символьный тип.
wchar_t: представляет широкий символьный тип, который может хранить символы Unicode.
Модификаторыsigned, unsigned, long и shortМожно применять к целочисленным типам,signedиunsignedМожно применять к символьным типам,longМожно применять к типам двойной точности.
Эти модификаторы также можно использовать в комбинации. Модификаторыsignedиunsignedтакже можно использовать какlongилиshortПрефикс модификатора. Например:unsigned long int。
C++ позволяет использовать сокращённую запись для объявленияunsigned short integerилиunsigned long integer. Можно опустить int и просто написать словоunsigned, shortилиlong,,intподразумевается. Например, следующие две инструкции обе объявляют беззнаковые целочисленные переменные.
signed int num1 = -10; // 定义有符号整型变量 num1,初始值为 -10 unsigned int num2 = 20; // 定义无符号整型变量 num2,初始值为 20 short int num1 = 10; // 定义短整型变量 num1,初始值为 10 long int num2 = 100000; // 定义长整型变量 num2,初始值为 100000 long long int num1 = 10000000000; // 定义长长整型变量 num1,初始值为 10000000000 float num1 = 3.14f; // 定义单精度浮点数变量 num1,初始值为 3.14 double num2 = 2.71828; // 定义双精度浮点数变量 num2,初始值为 2.71828 bool flag = true; // 定义布尔类型变量 flag,初始值为 true char ch1 = 'a'; // 定义字符类型变量 ch1,初始值为 'a' wchar_t ch2 = L'你'; // 定义宽字符类型变量 ch2,初始值为 '你'
Чтобы понять разницу между модификаторами знаковых и беззнаковых целых чисел, как их интерпретирует C++, давайте запустим следующую короткую программу:
Пример
Когда вышеприведённая программа запустится, она выведет следующие результаты:
-15536 50000
В приведённых выше результатах битовый шаблон беззнакового короткого целого 50,000 интерпретируется как знаковое короткое целое -15,536.
Квалификаторы типов в C++
Квалификаторы типов предоставляют дополнительную информацию о переменных; это ключевые слова, используемые для изменения поведения переменных или функций по умолчанию при их определении.
| Квалификаторы | Значение |
|---|---|
| const | constОпределяет константу, указывая, что значение переменной не может быть изменено. |
| volatile | МодификаторыvolatileУказывает, что значение переменной может быть изменено факторами вне программы, такими как аппаратное обеспечение или другие потоки. |
| restrict | с помощьюrestrictУказатель, изменённый таким образом, является единственным способом доступа к объекту, на который он указывает. Только C99 добавил новый квалификатор типа restrict. |
| mutable | mutable используется для изменения переменных-членов класса. Переменные-члены, изменённые с помощью mutable, можно изменять, даже если объект, которому они принадлежат, является const. |
| static | Используется для определения статических переменных, указывая, что область видимости переменной ограничена текущим файлом или текущей функцией и недоступна другим файлам или функциям. |
| регистр | Используется для определения register-переменных, указывая, что переменная часто используется и может храниться в регистрах процессора, чтобы повысить эффективность выполнения программы. Помечен как устаревший в C++11, официально удалён в C++17. |
пример const
const int NUM = 10; // 定义常量 NUM,其值不可修改 const int* ptr = # // 定义指向常量的指针,指针所指的值不可修改 int const* ptr2 = # // 和上面一行等价
пример volatile
volatile int num = 20; // 定义变量 num,其值可能会在未知的时间被改变
пример mutable
class Example {
public:
int get_value() const {
return value_; // const 关键字表示该成员函数不会修改对象中的数据成员
}
void set_value(int value) const {
value_ = value; // mutable 关键字允许在 const 成员函数中修改成员变量
}
private:
mutable int value_;
};
пример static
void example_function() {
static int count = 0; // static 关键字使变量 count 存储在程序生命周期内都存在
count++;
}
пример register
void example_function(register int num) {
// register 关键字建议编译器将变量 num 存储在寄存器中
// 以提高程序执行速度
// 但是实际上是否会存储在寄存器中由编译器决定
}Изменения в register после C++11:
- Помечено как устаревшее в C++11.
- Официально удалено в C++17
- Зарезервировано как ключевое слово (возможно, для совместимости или будущего использования)