C++排雷:13.const的各类用法总结

1.常量:const对变量加以限定-----顶层const

const int bufsize = 512;

这样就把bufsize定义成了一个常量。

  • 任何试图为bufsize赋值的行为都将引发错误:
bufsize = 512;    //错误:试图向const对象写值

因为const对象一旦创建其值就不能再改变,所以const对象必须初始化。

  • const对象初始化的方法:
const int i = get_size();
const int j = 42;
int k=52;
const int ci = k

2、常量引用:对常量的引用(对const的引用)----底层const常量的引用不能用作修改它所绑定的对象:

const int ci = 1024;
const int & r1 = ci;   //正确:引用及其对应的对象都是常量
r1 = 42;   //错误:r1是对常量的引用
int &r2 = ci; //错误:试图让一个非常量引用指向一个常量对象

虽然,这种操作形式对引用可参与的操作做出了限定
但是,对于引用的对象本身是不是一个常量未做限定:

int i =42; 
int &r1 = i; //引用r1绑定对象i
const  int &r2 = i;  // 引用r2也绑定对象i,但是不允许通过r2修改i的值
r1 = 0; // i 的值修改为0
r2 = 0; // 错误:r2 是一个常量引用

3、指针和const

3.1 指向常量的指针:不能用于改变其所指对象的值-----底层const:指针所指的对象是一个常量

const double pi  = 3.14 ;
const double *ptr = π

3.2 常量指针:必须初始化 -----顶层cosnt:指针本身是个常量

int  errNumb = 0 ;
int * const curErr = &errNumb;//curErr将一直指向errNumb

3.3 顶层const 和底层const的区别:

普通变量没有底层顶层的区别

int const a == const int a

只有对应指针,引用才会有区别:

  • 底层说白话就是不允许你对目标值进行修改
  • 顶层就是不允许你修改你的目标。

3.3.1底层const

非常量底层const

  • 可以赋值给常量底层const;

常量底层cosnt

  • 不能赋值给非常量底层const。

举例:

const int* b = &a;//

核心就是这是个指向常量的指针,*b被"const"住了,不能改!

  • a可以通过a = x来改变,但不可以通过*b = x来更改。
  • 可以将b指向别的地址,变量。例如声明int c =2;b = c。

3.3.2顶层const

非常量顶层const

  • 可以赋值给 常量顶层const;

常量顶层cosnt

  • 不能赋值给非常量顶层const。

举例:

int * const b = &a;

核心就是这是个指针常量(顶层,先是常量后是指针),b被"const"住了,不能改!

  • a既可以通过a = x来改变,也可以通过*b = x来改变
  • 但不可以把b指向别的地址、别的变量。例如声明 int c = 2;b=c即会报错

注意:const_cast只是C++的一种无奈之举,详情见const_cast内含

  • 当存在某个指向常量的指针(底层cosnt,不允许通过该指针改变其指向的内容),我们需要改变其指向的内容,但缺无法直接获取该变量
  • 这时候使用const_cast可以去掉上述指针的const属性,并将其中地址赋予新指针,这个新指针就可以去更改内容。

参考文献1
参考文献2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我明白了。这个排雷的程序可以用 Python 的 tkinter 模块来制作,具体的步骤如下: 1. 导入 tkinter 模块。 ```python import tkinter as tk ``` 2. 创建一个窗口,并设置窗口的标题和大小。 ```python root = tk.Tk() root.title("Minesweeper") root.geometry("500x500") ``` 3. 在窗口中添加一个 Label,用于显示游戏的标题。 ```python title_label = tk.Label(root, text="Minesweeper", font=("Arial", 24)) title_label.pack() ``` 4. 创建一个 10*10 的棋盘,并随机生成 25 个雷。可以用一个二维数组来表示棋盘,每个元素可以是一个 Button,用于接收玩家的左键和右键点击事件。 ```python board = [] for i in range(10): row = [] for j in range(10): button = tk.Button(root, text="", width=3, height=2) button.grid(row=i+1, column=j+1) button.bind("<Button-1>", left_click) button.bind("<Button-3>", right_click) row.append(button) board.append(row) # 随机生成 25 个雷 mines = set() while len(mines) < 25: i = random.randint(0, 9) j = random.randint(0, 9) if (i, j) not in mines: mines.add((i, j)) ``` 5. 定义左键点击和右键点击的回调函数。左键点击需要检查当前点击的位置是否有雷,如果有雷则游戏结束,否则需要显示当前位置周围的雷数。右键点击需要标记当前位置是否为雷。 ```python def left_click(event): button = event.widget i, j = get_index(button) if (i, j) in mines: button.config(text="X", bg="red") game_over() else: count = count_mines(i, j) button.config(text=count, bg="white") def right_click(event): button = event.widget i, j = get_index(button) if button.cget("text") == "": button.config(text="*", fg="red") elif button.cget("text") == "*": button.config(text="?", fg="blue") else: button.config(text="", fg="black") ``` 6. 实现计算当前位置周围的雷数的函数。 ```python def count_mines(i, j): count = 0 for a, b in [(i-1, j-1), (i-1, j), (i-1, j+1), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j), (i+1, j+1)]: if 0 <= a < 10 and 0 <= b < 10 and (a, b) in mines: count += 1 return count ``` 7. 实现游戏结束的函数。 ```python def game_over(): for i in range(10): for j in range(10): if (i, j) in mines: board[i][j].config(text="*", bg="white") else: count = count_mines(i, j) board[i][j].config(text=count, bg="white") ``` 8. 最后启动游戏。 ```python root.mainloop() ``` 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值