【嵌入式八股4】C++:引用、模板、哈希表与 I/O

1. 左值引用与右值引用

左值与右值的定义

  • 左值:指那些可以在表达式后取得地址的对象。换句话说,左值代表一个可以出现在赋值号(=)左边的值,也可以被修改。例如,变量、数组元素、以及通过引用或指针访问的对象都属于左值。

    例如:int a = 10; 其中 a 是左值。

  • 右值:指那些无法在表达式后取得地址的临时对象或字面量。右值代表一个临时值,它只能出现在赋值号的右边,不能直接修改。常见的右值包括数字常量、字符串常量、临时变量、以及通过表达式返回的临时对象。

    例如:int a = 10; 其中 10 是右值。

右值引用与 C++11

C++11引入了右值引用的概念,使用 && 来表示右值引用,允许程序员更方便地操作右值并实现移动语义完美转发

int&& r = 42; // 创建一个右值引用

2. 移动语义与完美转发

移动语义

std::move 是一个函数模板,它将给定的对象转换为右值,通常用于表示移动而非复制对象的所有权。通过 std::move,我们可以避免昂贵的对象复制操作,从而提高程序的性能。

int main() {
    std::vector<int> source = {1, 2, 3, 4, 5};

    // 使用std::move将source的所有权转移到destination
    std::vector<int> destination = std::move(source);

    // source现在为空,已经移动到destination
    std::cout << "Size of source: " << source.size() << std::endl; // 输出 0
    std::cout << "Size of destination: " << destination.size() << std::endl; // 输出 5

    return 0;
}

完美转发

std::forward 是另一个函数模板,主要用于在函数参数转发时保持其原始类型。与 std::move 类似,但 std::forward 可以根据传入的参数类型(左值或右值)自动转发。

在模板函数中,std::forward 使得我们能够精确地转发参数,保持参数的类型和生命周期,从而避免不必要的拷贝操作。

// 接受右值引用的函数
void processValue(int&& x) {
    std::cout << "Processing rvalue: " << x << std::endl;
}

// 使用std::forward转发参数
template<typename T>
void forwardFunction(T&& arg) {
    processValue(std::forward<T>(arg)); // 完美转发
}

int main() {
    int value = 42;

    // 传递左值
    forwardFunction(value);

    // 传递右值
    forwardFunction(std::move(value));

    return 0;
}

std::forward 的优势

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式八股/模拟面试拷打 文章被收录于专栏

一些八股模拟拷打Point,万一有点用呢

全部评论
接好运
点赞 回复 分享
发布于 03-06 20:01 山东
接好运
点赞 回复 分享
发布于 02-28 16:13 陕西

相关推荐

浪漫主义的虹夏:都是校友,还是同届,我就说直白点,不委婉了,我相信你应该也不是个玻璃心,首先你觉得一个双非的绩点写简历上有用吗?班长职务有用吗?ccf有用吗?企业会关心你高数满分与否吗?第二,第一个项目实在太烂,一眼就能看出是外卖,还是毫无包装的外卖,使用JWT来鉴权,把热点数据放进Redis这两个点居然还能写进简历里,说难听点这两个东西都是学个几十分钟,调用个API就能完成的事情,在双非一本的条件下,这种项目你觉得能拿出手吗,第二个项目你写的东西和你的求职方向有任何的匹配吗?第三,计设那一块毫无价值,如果想突出自己会前端,直接写入专业技能不行吗,最后,专业技能里像深入理解JVM底层原理这种你觉得这句话你自己真的能匹配吗?都是校友加上同届,我措辞直接,但希望能点出你的问题,想进大厂还得继续沉淀项目和学习
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务