前言

这一节我们将学习修饰符类型的的相关知识,可能会涉及到一些C++的基本语法以及C++变量类型、C++变量作用域的相关知识,如果你还有不明白的,请到C++基本语法C++变量类型C++变量作用域这里温故一下

C++修饰符类型


什么是修饰符类型?

修饰符是用来调整变量的存储范围和行为的关键字。例如:

  • 变量是否能存储负数?
  • 变量的存储范围是更大还是更小?

C++ 提供了多个修饰符来满足不同的需求


常见修饰符

  1. signed(有符号)

    • 变量可以存储正数和负数。
    • 默认情况下,整型变量(int)都是有符号的,所以intsigned int是一样的。
  2. unsigned(无符号)

    • 变量只能存储正数。
    • 因为没有负数,存储范围扩大了一倍(范围从0开始)。
  3. short(短整型)

    • int的存储范围更小,通常用来节省存储空间。
  4. long(长整型)

    • int的存储范围更大,适合表示更大的数字。
    • C++11 增加了long long,存储范围比long还要大。
  5. float(单精度浮点数)

    • 用来表示带小数的数字,精度较低。
  6. double(双精度浮点数)

    • 用来表示带小数的数字,精度比float更高。
  7. bool(布尔类型)

    • 只有两个值:truefalse,常用于条件判断。
  8. char(字符类型)

    • 用来存储单个字符,比如'a'
  9. wchar_t(宽字符类型)

    • 用来存储Unicode字符,可以表示多国语言的字符。

修饰符的组合

  • 修饰符可以组合使用,例如:

    • unsigned long int:无符号长整型。
    • short unsigned int:无符号短整型。
  • 简写方式

    • 省略int是允许的,例如:
      1
      2
      unsigned num1 = 10; // 无符号整型变量
      short num2 = 5; // 短整型变量

实际例子

示例 1:普通变量的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
signed int num1 = -10;    // 有符号整型,值为 -10
unsigned int num2 = 20; // 无符号整型,值为 20

short num3 = 10; // 短整型,值为 10
long num4 = 100000; // 长整型,值为 100000

long long num5 = 10000000000; // 长长整型,值为 10000000000

float pi = 3.14f; // 单精度浮点数,值为 3.14
double e = 2.71828; // 双精度浮点数,值为 2.71828

bool flag = true; // 布尔值,表示真
char ch = 'A'; // 字符,值为 'A'
wchar_t wideChar = L'你'; // 宽字符,值为 '你'

示例 2:有符号和无符号的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
short int i; // 有符号短整型
short unsigned int j; // 无符号短整型

j = 50000; // 无符号变量 j 存储 50000
i = j; // i 将 j 的位模式解释为有符号数

cout << i << " " << j; // 输出 -15536 和 50000
return 0;
}

解释:

  • j存储的值是50000,它的二进制表示不会改变。
  • 当将j的值赋给i时,二进制位模式被解释为有符号数,因此显示为-15536

小总结

  • 有符号(signed):可以存储正数和负数。
  • 无符号(unsigned):只能存储正数,存储范围更大。
  • short 和 long:分别表示更小或更大的整型范围。
  • float 和 double:用于存储小数,double的精度更高。
  • bool 和 char:布尔值表示真/假,字符表示单个字符。
  • wchar_t:表示Unicode字符。
    通过修饰符,C++ 能够更灵活地定义变量类型,适应不同的存储需求。

C++中的类型限定符


什么是类型限定符?

类型限定符是C++中的关键字,用来给变量或函数添加额外的“行为限制”或“说明”。它们可以改变变量的默认行为,使其更适应特定需求。


常见的类型限定符

限定符 含义
const 表示变量是常量,定义后它的值不能被修改。
volatile 告诉编译器,这个变量的值可能会被外部(如硬件或其他线程)改变,因此不能对它的访问进行优化。
restrict 仅在C99标准中:表示一个指针是访问它所指向对象的唯一方式,用于优化指针操作。
mutable 用于修饰类的成员变量,即使类对象是const的,也允许修改这个变量。
static 表示变量是静态的,它的生命周期贯穿整个程序,并且作用范围有限。
register 提示编译器将变量存储在CPU寄存器中,以提高访问速度(实际效果由编译器决定)。

示例解释

1. const(常量)

  • 定义后变量的值不能被修改。
  • 示例
    1
    2
    const int NUM = 10; // NUM 是一个常量,不能被改变
    const int* ptr = &NUM; // ptr 是指向常量的指针,指针所指向的值不能修改
  • 通俗解释
    • NUM是一个固定的值,就像刻在石头上的数字,无法更改。
    • ptr是指向这块石头的指针,你可以看它,但不能刻字。

2. volatile(易变变量)

  • 告诉编译器,这个变量的值可能会在程序以外被修改(如硬件或多线程)。
  • 示例
    1
    volatile int num = 20; // num 的值可能会被硬件改变
  • 通俗解释
    • 这个变量是一个随时可能“被动”变化的数字,比如硬件设备传回来的数据。

3. mutable(可变成员变量)

  • 修饰类成员变量时,即使对象是const,这个变量也可以被修改。
  • 示例
    1
    2
    3
    4
    5
    6
    7
    8
    class Example {
    public:
    void set_value(int value) const {
    value_ = value; // 允许修改 value_,即使这个函数是 const 的
    }
    private:
    mutable int value_; // value_ 是可变的
    };
  • 通俗解释
    • 一个“特别许可”的变量,即使在“禁止修改”的情况下,也可以被改变。

4. static(静态变量)

  • 静态变量的生命周期贯穿整个程序,作用范围却受限。
  • 示例
    1
    2
    3
    4
    void example_function() {
    static int count = 0; // count 的值在整个程序中保留
    count++;
    }
  • 通俗解释
    • 静态变量就像一个“长期储存”的数据,即使函数结束,它的值也会保留。

5. register(寄存器变量)

  • 建议编译器将变量存储在CPU的寄存器中,以提高访问速度(是否采纳由编译器决定)。
  • 示例
    1
    2
    3
    void example_function(register int num) {
    // 提示编译器将 num 存储在寄存器中
    }
  • 通俗解释
    • 把一个变量放在“最快的储物柜”里,方便程序快速访问。

小总结

  • **const**:值不能改动,就像固定的规则。
  • **volatile**:值可能会被外部修改,比如实时更新的数据。
  • **mutable**:给特别变量的“修改许可”。
  • **static**:数据长期有效,即使函数多次调用也保留值。
  • **register**:请求把变量放到“快速通道”,提高访问速度。
    可以看出,这些限定符让C++中的变量更灵活、更高效地适应不同的需求。