首页 > 编程语言 >C++语法学习整理

C++语法学习整理

时间:2024-11-15 23:18:48浏览次数:1  
标签:std 右值 move 左值 C++ 语法 参数 引用 整理

目录

1、move与forward

move

  • 语法形式:std::move<T>(t),T 是要转换的对象的类型(通常可以通过模板参数推导自动确定),t 是要被转换(移动)的左值对象;
  • 应用场景:资源所有权转移
    • 1)容器元素移动:当需要高效地将一个容器中的元素移动到另一个容器时可以使用std::move,可以减少不必要的拷贝操作;
    std::vector<std::string> vec1 = {"apple", "banana", "cherry"};
    std::vector<std::string> vec2;
    vec2 = std::move(vec1);
    
    • 2)函数返回值优化:函数返回一个局部对象时,可以使用std::move来提示编译器进行移动语义而不是拷贝语义,将局部对象的资源所有权直接转移给函数调用者,不用拷贝从而提高性能;
    std::vector<int> create_vector() {
      std::vector<int> v = {1, 2, 3};
      return std::move(v);
    } 
    

forward

  • 语法:std::forward<T>(t),T 是一个模板参数指定的类型,t 是一个参数(通常是一个万能引用,即T&&形式的参数);
  • 应用场景:完美转发
    • 函数模板参数转发:用于在函数模板中实现完美转发,将函数的参数以其原始的值类别(左值或右值)传递给另一个函数。如下,wrapper函数可以接收任意函数 f 和任意参数 args ,并且通过 std::forward 将 args 以其原始的值类别转发给f。这样,f可以根据参数的实际值类别(左值引用或右值引用)进行最优化的处理,比如对于右值参数可以进行移动操作,对于左值参数可以进行正常的引用操作
    template<typename Func, typename... Args>
    auto wrapper(Func&& f, Args&&... args) {
        return f(std::forward<Args>(args)...);
    }
    

2、左值和右值

左值

  • 左值是指表达式结束后依然存在的持久对象。可以获取它的地址,并且能够对其进行赋值操作;在 C++ 中,变量名就是典型的左值;
  • 特性:
    • 可寻址性;
    • 可赋值性;

右值

  • 右值是指表达式结束后就不再存在的临时对象。通常是字面量、临时变量或者是函数返回值等这些不能获取地址,,并且不能对其进行常规赋值操作的对象;
  • 特性:
    • 临时性;
    • 不可赋值性;

引用和值类别之间的关系

  • 左值引用:用&来表示,它绑定到左值上。例如,int a = 5; int& ref_a=a;,这里ref_a是左值引用,它绑定到左值 a上,通过 ref_a 可以修改 a 的值;
  • 右值引用:用&&来表示,它主要用于绑定到右值上,如int&& rref = 5rref是右值引用,它绑定到右值5上;
    • 作用:允许我们对右值进行一些特殊的操作,比如将右值所代表的资源 “窃取” 过来,而不是进行拷贝操作,这在对象构造和赋值等操作中可以提高性能;

3、

标签:std,右值,move,左值,C++,语法,参数,引用,整理
From: https://www.cnblogs.com/gq-z/p/18548860

相关文章

  • 09C++选择结构(3)——教学
    一、求3个整数中最小值题目:输入三个整数,表示梨的重量,输出最小的数。方法1:经过三次两两比较,得出最小值。a<=b&&a<=cmin=ab<=c&&b<=amin=bc<=b&&c<=amin=c流程图:方法2:先找出a和b中较小的那个数,把较小的数赋值给min,然后再让min和c比较,找出最小值。流程图:方法......
  • 08C++选择结构(2)
    一、逻辑变量教学视频存储类似灯亮或灯灭、是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量。逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真),false和true是逻辑常量,又称布尔常量。流程图如下:#include<typeinfo>//变量类型头文件,还......
  • 初级数据结构——栈题库(c++)
    目录前言1.杭电oj——Bitset2.杭电oj——进制转换[3.力扣——LCR123.图书整理I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)[4.力扣——LCR027.回文链表](https://leetcode.cn/problems/aMhZSa/)[5.力扣——1614.括号的......
  • C++语言之旅【0】---(最通俗易懂的入门文章!!!)
    本章概述C++发展历史C++的重要性体现C++学习建议和书籍推荐C++的输入&输出彩蛋时刻!!!C++发展历史简介:在C语言的学习中咱们讲过了C语言的发展史,让大家对C语言有了感性的认知。现在咱们也延续传统——从C++的发展史讲起。C++的起源可以追溯到1979年,当时BjarneStroustrup......
  • 【DEV-C++创建分文件项目】【零基础 小白 可上手的清晰易懂教程!】
    DEV-C++创建项目【DEV-C++创建项目】1、首先创建一个项目文件夹2、再点击创建的文件夹,在里面创建几个分类文件3、打开DEV-C++,然后点击【新建项目】4、选择Basic中的【ConsoleApplication】,选择【C++】,再写入自己要建立的【项目名称】5、创建完毕后将其放入到刚刚创建......
  • C++编程:实现一个简单的消息总线
    文章目录0.引言1.设计思路1.1关键类设计1.2类图1.3时序图1.4流程图2.代码结构与设计2.1消息回调与订阅项2.2消息总线类`MessageBus`2.3定时任务调度器`PeriodicTaskScheduler`3.核心功能实现3.1消息发布3.2超时检查4.测试代码0.引言在之前的文......
  • 【语法】宾语
    宾语类型名词或名词短语:当动词需要一个具体的对象或事物作为其行为的目标或接受者时,通常使用名词或名词短语作宾语。例如:“Iateanapple.”(我吃了一个苹果。)这里的“anapple”是名词短语,作为“ate”的宾语。代词:代词用于代替前面提到的名词,以避免重复。当动词需要一......
  • 【C++】list 类深度解析:探索双向链表的奇妙世界
    ......
  • C++命名空间介绍、定义、作用、是否允许嵌套
    本文章代码块默认为写了std命名空间的条件下,所以代码里面的输出直接写了cout,没写作用域什么是c++命名空间C++命名空间是一种机制,用于解决全局变量名或函数名之间的冲突问题。它可以将一组相关的变量、函数和类组织在一起,形成一个独立的命名空间,避免命名冲突。命名空间通过在......
  • 什么是 C++ 中的常量表达式? 有什么用途?and如何判断一个表达式是否是常量表达式?
    参考文献:constexpr介绍以及与const的区别-CSDN博客定义在C++中,常量表达式是一种在编译期间就能计算出结果的表达式。字面量常量:如整数字面量(1、2、3等)、字符字面量('a'、'b'等)、布尔字面量(true、false)和浮点字面量(3.14、2.718等)。例如,表达式3+4中的3和4就是整数字面量,整......