吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 541|回复: 9
上一主题 下一主题
收起左侧

[学习记录] 今天对比c++学习了rust 有以下收获

  [复制链接]
跳转到指定楼层
楼主
bjszz 发表于 2026-3-8 21:11 回帖奖励
本帖最后由 bjszz 于 2026-3-8 21:11 编辑

Rust 和 C++
一、在所有权转移(std::move)
这是c++11以后的新特性,将左值强制转换为右值引用。Rust 核心规则,移动是「所有权的转移」;移动后原变量完全失效,编译器会报错。
[C++] 纯文本查看 复制代码
let p1 = String::from("我的遥控车");
let p2 = p1; // 你把遥控车给了 p2
// println!("p1 还有遥控车吗?{}", p1);
// 如果你尝试运行这行代码,Rust 编译器会直接报错!

二、不可变 / 可变变量(mut)
rust显式标记。必须使用 let mut 声明一个可变变量。c++直接声明即可修改,除非用 const 修饰。
[C++] 纯文本查看 复制代码
fn main() {
   let mut mutable_binding = 1; // 声明一个可变变量
   println!("修改前:{}", mutable_binding);
   mutable_binding += 1; // 修改变量的值
   println!("修改后:{}", mutable_binding);
   // let immutable_binding = 1;
   // immutable_binding += 1; // 错误:不可变变量不能被修改
}


三、不安全内存(unsafe/unsafe)
rust 用于显式开启特定操作,如解引用原始指针、调用外部函数等。它将风险隔离在代码块中,提醒审查者此处需要格外注意,c++却无对应概念
[C++] 纯文本查看 复制代码
//不安全的Rust
fn main() {
    let mut num = 5;

    //创建可变、不可变裸指针,可以在安全代码块创建。只是不能在不安全的代码块之外解引用裸指针
    //不可变裸指针
    //使用变量的地址,通过as创建裸指针
    let r1 = &num as *const i32;
    //可变裸指针
    let r2 = &mut num as *mut i32;

    //在安全代码块中,不能解引用裸指针
    // println!("r1 is: {}", *r1); //error dereference of raw pointer is unsafe and requires unsafe block
    // println!("r2 is: {}", *r2);

    //使用unsafe块解引用裸指针
    unsafe {
        println!("r1 is: {}", *r1);
        println!("r2 is: {}", *r2);
    }
}


四、生命周期显式标记有很多不之处
rust显式标注 ('a)。当生命周期关系复杂时,需要在函数签名或结构体中用泛型生命周期参数(如 <'a>)明确标注出来。c++没有在语言层面表达引用有效期的机制



[C++] 纯文本查看 复制代码
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

fn main() {
  let x = String::from("x1");
  let y = String::from("y");
  let res = longest(&x, &y);
  println!("{}", res);
}


把返回值改成 'static

[C++] 纯文本查看 复制代码
fn longest<'a>(x: &'a str, y: &'a str) -> &'static str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}


会报错:

[C++] 纯文本查看 复制代码
error: lifetime may not live long enough
 --> examples/main.rs:3:9
  |
1 | fn longest<'a>(x: &'a str, y: &'a str) -> &'static str {
  |            -- lifetime `'a` defined here
2 |     if x.len() > y.len() {
3 |         x
  |         ^ returning this value requires that `'a` must outlive `'static`


你显式标注的生命周期是为了告诉编译器你写的这个函数要求传入或者返回的引用类型是什么样的。
大部分情况下,编译器都会理解你函数中引用的意思,所以你不需要标注了。

免费评分

参与人数 1吾爱币 +1 收起 理由
gggwvg + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
HQF0729 发表于 2026-3-8 21:52
嘻嘻,康康,学习学习
3#
charlieb1 发表于 2026-3-9 00:46
4#
heptamemory 发表于 2026-3-9 00:57
5#
Wilboy 发表于 2026-3-9 01:36
先看了 准备有空了也学习下
6#
vip5120 发表于 2026-3-9 01:38
C++入门难吗?
7#
 楼主| bjszz 发表于 2026-3-9 06:35 |楼主

先把c语言搞懂,再学c++,c++是c语言的超集
8#
shuimjx87 发表于 2026-3-9 08:25
逻辑转变真难
9#
jianghai19 发表于 2026-3-9 08:39
年纪大了C++都还没学会,咋办
10#
piyanuo 发表于 2026-3-10 11:05
学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-3-10 15:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表