总体导向图
C++以T*
为分界,左物右指。T
是类型名,x
是变量名
把握一个关键:
- 指针类型定义时候,Rust 存在
&
,C++存在*
,定义类型名x
本质就是一个指针类型,因此mut/const
标记靠近谁就定义了谁的行为 - Rust中
mut
靠近x
就代表x
可变,也就是指针可变;同理C++中const
靠近x就代表x
可变,也就是指针不可变。 - Rust中
mut
靠近类型T
,就代变内容可变;同理C++中const
靠近T
就代表内容不可变。
Rust | C++ | 说明 |
---|---|---|
let x : &T |
const T* const x |
指针和内容均不可变 |
let x : &mut T |
T* const x |
指针不可变,内容可变 |
let mut x : &T |
const T* x |
指针可变,内容不可变 |
let mut x : &mut T |
T* x |
指针和内容均可变 |
举例Rust:
//情况一指针和内容均不可变
pub fn Pconst_Cconst(){
let x : &i32 = &33;
let y : i32 = 34;
*x = 55; // error 试图改变内容
x = &y; // error 试图改变指针
}
// 情况二,指针不可变,内容可变
pub fn Pconst_Cmut(){
let x :&mut i32 = &mut 33;
let y : &mut i32 = &mut 34;
*x = 55; // Ok 可以改变内容
x = y; // error 试图改变指针
}
// 情况三,指针可变,内容不可变
pub fn Pmut_Cconst(){
let mut x : &i32 = &33;
let mut y : i32 = 34;
*x = 55; // error 试图改变内容
x = &y; // Ok 可以改变指针本身
}
// 情况四,指针和内容均可变
pub fn Pmut_Cmut(){
let mut x : &mut i32 = &mut 33;
let mut y : i32 = 34;
*x = 55; // Ok 可以改变内容
x = &mut y; // Ok 可以改变指针本身
}
举例C++:
//情况一指针和内容均不可变
void Pconst_Cconst(){
int i = 33;
int y = 35;
const int* const x = &i;
*x = 34; // error 试图改变内容
x = &y; // error 试图改变指针
}
// 情况二,指针不可变,内容可变
void Pconst_Cmut(){
int i = 33;
int y = 35;
int* const x = &i;
*x = 34; // Ok 可以改变内容
x = &y; // error 试图改变指针
}
// 情况三,指针可变&#