西嘎嘎学习 - C++修饰符类型 - Day 5
1 什么是修饰符类型
在C++中,修饰符类型(Type Modifiers) 是用来修饰基本数据类型的关键词,它们可以改变变量的大小、符号性(有符号或无符号)等属性。
2 常见的修饰符类型
修饰符 | 说明 | 示例 |
---|---|---|
signed | 表示有符号数(默认) | signed int a; |
unsigned | 表示无符号数(非负) | unsigned int b; |
short | 表示短整型(比 int 小) | short c; |
long | 表示长整型(比 int 大) | long d; |
long long | 表示更长的整型(C++11新增) | long long e; |
3 修饰符与基本类型的组合
修饰符可以和基本类型(如 int
、char
)组合使用,以定义更精确的变量类型。
(1)signed 和 unsigned
signed:表示变量可以存储正数、负数和零(默认)
unsigned:表示变量只能存储非负数(0 和 正数)
示例:
signed int a = -10; // 可以存储负数
unsigned int b = 100; // 只能存储非负数
(2)short、int、long、long long
类型 | 通常占用字节数 | 取值范围(示例) |
---|---|---|
short int | 2 | -32768 到 32767 |
int | 4 | -2147483648 到 2147483647 |
long int | 4 或 8 | 取决于系统 |
long long int | 8 | -9223372036854775808 到 9223372036854775807 |
示例:
short s = 100;
int i = 1000;
long l = 1000000;
long long ll = 1000000000000;
4 修饰符与 char
类型
char 类型也可以使用 signed 和 unsigned 修饰符。
类型 | 通常占用字节数 | 取值范围(示例) |
---|---|---|
signed char | 1 | -128 到 127 |
unsigned char | 1 | 0 到 255 |
signed char sc = -10;
unsigned char uc = 200;
5 修饰符与 float
和 double
float
和 double
是浮点类型,它们不能使用 signed
或 unsigned
修饰符,因为浮点数默认就是有符号的。
float f = 3.14;
double d = 3.1415926535;
6 修饰符的组合使用
unsigned long int uli = 1000000;
long long int lli = 1000000000000;
7 修饰符的命名规范
虽然修饰符本身是英文,但变量名建议使用英文命名,并遵循驼峰命名法或下划线命名法。
unsigned int max_score = 100;
long long total_count = 1000000000;
8 完整示例
#include <iostream>
using namespace std;int main() {signed int a = -10;unsigned int b = 100;short s = 100;long l = 1000000;long long ll = 1000000000000;unsigned char uc = 200;cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "s = " << s << endl;cout << "l = " << l << endl;cout << "ll = " << ll << endl;cout << "uc = " << (int)uc << endl; // 强制转换为 int 才能输出return 0;
}
9 总结
修饰符 | 说明 | 示例 |
---|---|---|
signed | 有符号数 | signed int a; |
unsigned | 无符号数 | unsigned int b; |
short | 短整型 | short c; |
long | 长整型 | long d; |
long long | 更长的整型 | long long e; |
char | 字符类型 | char ch = 'A'; |
float | 单精度浮点数 | float f = 3.14; |
double | 双精度浮点数 | double d = 3.14159; |
10 什么是类型限定符
类型限定符(Type Qualifiers) 是C++中用于修饰变量的访问方式的关键词。它们不会改变变量的类型,但会限制变量的使用方式,比如是否可以被修改、是否可以被多个线程访问等。
11 C++中常用的类型限定符
限定符 | 说明 | 示例 |
---|---|---|
const | 表示变量的值不能被修改 | const int x = 10; |
volatile | 表示变量的值可能被外部修改(如硬件) | volatile int flag; |
restrict | 表示指针是唯一访问该内存的指针(C99引入,C++11支持) | int* restrict p; |
mutable | 允许类中的成员变量在 const 对象中被修改 |
12 const
限定符详解
(1)const
的作用
const
表示变量的值不能被修改,一旦赋值,就不能再更改。
const int MAX_AGE = 120;
MAX_AGE = 130; // ❌ 错误:不能修改 const 变量
(2)const
与指针
const
可以修饰指针本身或指针指向的内容。
情况一:指针指向的内容不能被修改
const int* p = &x;
*p = 10; // ❌ 错误:不能修改指针指向的内容情况二:指针本身不能被修改(不能指向其他地址)
int* const p = &x;
p = &y; // ❌ 错误:不能修改指针本身情况三:指针和指向的内容都不能被修改
const int* const p = &x;
*p = 10; // ❌ 错误
p = &y; // ❌ 错误
(3)const
与函数参数
在函数参数中使用 const
,可以防止函数内部修改参数的值。
void printValue(const int value) {// value = 100; // ❌ 错误:不能修改 const 参数cout << value << endl;
}
13 volatile
限定符详解
(1)volatile
的作用
volatile
表示变量的值可能被外部修改,比如硬件、中断、多线程等。编译器不会对 volatile
变量进行优化,每次访问都会从内存中读取。
volatile int sensorValue; // 表示这个值可能被外部硬件修改
(2)volatile
与 const
的组合
const volatile
表示变量的值不能被程序修改,但可能被外部修改。
const volatile int temperature; // 程序不能修改,但硬件可能修改
14 restrict
限定符详解
(1)restrict
的作用
restrict
是C99引入的限定符,C++11也支持。它用于告诉编译器某个指针是唯一访问该内存的指针,从而允许编译器进行更激进的优化。
void add(int* restrict a, int* restrict b, int* restrict c) {*c = *a + *b;
}
restrict
表示 a
、b
、c
指向的内存区域互不重叠,编译器可以据此优化代码。
15 mutable
限定符详解
(1)mutable
的作用
mutable
用于类的成员变量,表示该变量即使在 const
对象中也可以被修改。
class Counter {
public:void increment() const {counter++; // ✅ 允许修改 mutable 变量}private:mutable int counter = 0;
};
16 类型限定符的命名规范
虽然限定符本身是英文,但变量名建议使用英文命名,并遵循驼峰命名法或下划线命名法。
const int MAX_SPEED = 120;
volatile int sensor_value;
mutable int call_count;
17 类型限定符的使用场景
限定符 | 使用场景 |
---|---|
const | 定义常量、防止变量被修改 |
volatile | 多线程、硬件寄存器、中断处理 |
restrict | 指针优化(C99/C++11) |
mutable | 类中允许 const 对象修改变量 |
18 类型限定符的注意事项
const
变量必须在声明时初始化。volatile
不能与const
冲突,但可以组合使用。restrict
是C语言特性,C++中支持但使用较少。mutable
只能用于类的成员变量。
19 完整示例
#include <iostream>
using namespace std;const int MAX_AGE = 120;
volatile int sensorValue = 0;class Counter {
public:void increment() const {counter++;}void print() const {cout << "Counter: " << counter << endl;}private:mutable int counter = 0;
};int main() {// const 变量cout << "最大年龄: " << MAX_AGE << endl;// volatile 变量cout << "传感器值: " << sensorValue << endl;// mutable 变量Counter c;c.increment();c.print();return 0;
}
20 总结
限定符 | 说明 | 示例 |
---|---|---|
const | 值不能被修改 | const int x = 10; |
volatile | 值可能被外部修改 | volatile int flag; |
restrict | 指针是唯一访问该内存的指针 | int* restrict p; |
mutable | 允许 const 对象修改变量 | mutable int counter; |