zoukankan      html  css  js  c++  java
  • 学习第55天

    C++

    1. 左值和右值、

      1. 左值是能用在赋值语句等号左侧、代表一个地址
      2. 为了对比左值所以出现了右值、与左值相反、
      3. 表达式先判断是否为左值、非左即右、没有其它选项、
      4. 左值可以当成右值使用、
      5. a=a+1——a是左值不是右值、a在右边是所以a有右值属性(非右值属性)、a左边代表地址、右边代表值、
      6. 一个左值可以同时具有右值属性和左值属性、变量是左值
      7. 可以将左值表达式理解为左值、而右值表达式便是右值、
      8. 赋值运算符、地址运算符、容器下标、迭代器递增递减、等均需要用到左值、只要运算符在字面值上能操作一般都需要左值、
      9. 左值表达式的求值结果是个对象、必须有地址、有地址不一定是左值、但是左值一定要有地址、地址是核心、
    2. 引用分类、

      1. 三种引用方式、
        1. 左值引用(绑定到左值)
        2. const引用(常量引用)是左值引用的一种、特点是、不能改变值的对象、
        3. 右值引用(绑定到右值)相当于为左值引用而生、其主要作用是临时的引用、
      2. 右值引用使用 &&a=1 1便是临时的值、临时保存、
    3. 左值引用、

      1. 将变量值绑定到左值上便是左值引用、大部分都是左值引用、

      2. 引用一定要绑定一个数值、不像指针有空指针、引用没有空引用、初始化绑定、引用必须初始化、

      3. 左值引用必须绑定到左值不能绑定给到右值

      4. int a=3//左值因为变脸便是左值、
          int &c=a//绑定左值、  
         int &a1=++b//左值
        
      5. 任何函数里面的形参都是做左值、

    4. 右值引用、

      1. 右值引用的引用目的、

        1. 绑定一些即将销毁的或者临时的对象上、
        2. 右值引用 && 代表新的数据类型、
        3. 目的是通过把拷贝对象变成移动对象来提高运行效率
        4. 移动对象是替代拷贝对象而出现的、将a移动到b、方式是a自己开辟了内存、b也需开辟内存存储数据、移动对象就是b不再开辟内容而直接将a的内存给b、将a的内存直接移交给b、或者b偷a的所有内存、
        5. 移动对象后a便不能再使用、
        6. 右值引用是为了应付移动构造函数和移动赋值运算符而用的
      2. 必须是绑定到右值的引用、

      3. 右值引用也是引用 即对象的名字、

      4. 右值引用也是有地址的、

      5. 左值不能绑定到临时变量、临时变量有地址但是系统将其当成右值、

      6. 要想将临时变量绑到左值可以使用const引用、const引用不仅可以绑定还可以执行隐式转换并将值放到临时变量中、

      7. int e;
        	int a = e;
        	int e = 10;
        
        		int& c = a;
        
        
        		int&& d = 100;//右值
        
        
        
    5. std::move函数、

      1. 将左值强制转换成右值、唯一的作用

      2. 没有移动的功能

      3. 	int a = 29;
        	int&& b = std::move(a);//强行绑定、也是move的唯一作用、
        
        
      4. 将b和a绑定在一起、改变b、a也会改变、改变a、b也会改变、

      5. 	int a = 29;
        	int&& b = std::move(a);//强行绑定、也是move的唯一作用、
        
        
        	string c = "这是字符串";//运行后c的内容为空、
        	const char* f = c.c_str();
        	string e = std::move(c);//其实是、std::move触发了string里面的函数、将c里面的内容清空啦、  string是移动构造函数、将c的值移动到e里面、
        	const char* s = e.c_str();
        	cout << c << endl;
        	cout << e << endl;
        	cout << b << endl;
        
        
        
      6. 转移并非是move做的、e是重新开辟的内存存储c的内容、

      7. c和e均各有自己的内存、

      8. string &&e = std::move(c) 这样就不会触发string的内部函数、而是右值引用、

    6. 总结、

      1. 左值绑定左值、右值绑定右值、const则可以绑定右值或左值、

      2. a– –(后置递增或递减运算符)返回右值、— —a (前置递增或递减运算符)返回的是左值、

      3. 	int a = 1;
        	int&& b = a++;//右值、b和a没有任何关系
        	int& c = ++a;//左值、
        
      4. 系统不建议执行move后继续使用移动的值、也就是 c 但是、后续仍然可以使用

      5. int a = 29;
        	int&& b = std::move(a);//强行绑定、也是move的唯一作用、
        
        
        	string c = "这是字符串";//运行后c的内容为空、
        	const char* f = c.c_str();
        	string &&e = std::move(c);//系统不让使用在以后的代码中出现c
        	const char* s = e.c_str();
        	c = "abc";//后续仍然可以使用、
        	//e = "aaa";
        
        	cout << c << endl;
        	cout << e << endl;
        	cout << b << endl;
        
        
  • 相关阅读:
    angularjs学习之六(angularjs中directive指令的一般编程事件绑定 模板使用等)
    Flex 容器基本概念
    flex 4 布局样式
    flex 特效
    delphi ehLib 安装包下载及安装方法
    CnPack IDE 专家包(CnWizards)显示代引用单元列表
    Delphi 获取DataSet传入参数后的SQL命令
    偶写的第一个控件,一个用选择代替输入的Edit控件…
    delphi中响应鼠标进入或离开控件的方法
    Delphi常用关键字用法详解
  • 原文地址:https://www.cnblogs.com/chengyaohui/p/13834019.html
Copyright © 2011-2022 走看看