首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【译】理解C和C++中的左值和右值

C99标准正式地定义了可修改的左值: 一个左值不是数组类型,没有不完全类型,不能有const修饰,如果它是一个结构体或者联合union,则不能有任何用const修饰的成员(包括)。...右值不能赋给一个非const的左值引用,因为这要求一个无效的从右值到左值的转换。...这个操作符将右值的内部缓存转换成它自己的,所以右值的析构函数释放时,会将我们这个对象的缓冲区也给释放了。 再次说明,上述示例只是右值引用和移动语义的冰山一角。...要真正理解C++这些新特性,就必须深入理解左值和右值。 【1】右值可以被显示地赋给左值,应当使用左值的地方,右值不能被隐式地转换。 【2】C++11标准section 4.1。...【5】现在你们知道为什么我坚持把operator= 称作拷贝赋值运算符。在C++11里,这个区别尤其重要。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    聊聊结构化绑定

    name是一个C风格字符串,它大概是从C代码继承来的,我希望客户能用上C++风格的std::string;score属于Transcript类型,表示学生的成绩单,这个结构比较大,我希望能传递const...为此,我写明了三要素:std::tuple_size、std::tuple_element和get。这种机制给了结构化绑定很强的灵活性。...先引入一个名字e,E为其类型: •当expression是数组类型A,且ref-operator不存在时,E为cv A,每个元素由expression中的对应元素拷贝(= expression)或直接初始化...然后分三种情况讨论: •数组情形,E为T的数组类型,则每个结构化绑定都是指向e数组中元素的左值;被引类型(referenced type)为T;——结构化绑定是左值,不是左值引用:int array[2...至此,我想“结构化绑定”的意义已经明确了:标识符总是绑定一个对象,该对象是另一个对象的成员(或数组元素),后者或是拷贝或是引用(引用不是对象,意会即可)。

    32910

    分享丨CC++内存管理详解--堆、栈

    所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。 内存分配成功并且已经初始化,但操作越过了内存的边界。例如在使用数组时经常发生下标“多1”或者“少1”的操作。...规则1:用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 规则2:不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。...若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。...语句 p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存,再用strcpy进行字符串复制。...这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

    1.1K21

    C++类自动提供的特殊成员函数

    - 最后⼀种声明使⽤motto **初始化⼀个匿名对象**,并将新对象的地址赋给pstring指针。 每当程序⽣成了对象副本时,编译器都将使⽤复制构造函数。...复制的另⼀种形式(成员复制或浅复制)只是复制指针 值。浅复制仅浅浅地复制指针信息,⽽不会深⼊“挖掘”以复制指针引⽤的结构。...赋值运算符: ANSI C允许结构赋值,⽽C++允许类对象赋值,这是通过⾃动为类重载赋值运算符实现的。...& StringBad::operator=(const StringBad &); ``` 赋值运算符的功能及何时调用: 将已有的对象赋给另⼀个对象时,将使⽤重载的赋值运算符: StringBad...函数应当避免将对象赋给⾃⾝;否则,给对象重新赋值前,释放内 存操作可能删除对象的内容。 函数返回⼀个指向调⽤对象的引⽤。

    72410

    C++教程(凯格尔训练法教程)

    可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。 多个变量赋同一个值时,需要分别赋值。...:数组名[下标] 初始化数组时,可以只给部分数组元素赋值 对全部元素数组赋值时,可以不指定数组长度,编译系统会根据初值个数确定数组的长度。...int a = 100; //不转换 a = (int)12.34; //强制转换(直接舍去小数部分,得到12) 弱类型语言-在定义变量时不需要显式地指明数据类型,编译器(解释器)会根据赋给变量的数据自动推导出类型...,并且可以赋给变量不同类型的数据。...var a = 100; //赋给整数 a = 12.34; //赋给小数 a = "heiren,HelloWorld"; //赋给字符串 a = new Array("JavaScript",

    2.9K20

    C++教程(最全)「建议收藏」

    可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。 多个变量赋同一个值时,需要分别赋值。...:数组名[下标] 初始化数组时,可以只给部分数组元素赋值 对全部元素数组赋值时,可以不指定数组长度,编译系统会根据初值个数确定数组的长度。...int a = 100; //不转换 a = (int)12.34; //强制转换(直接舍去小数部分,得到12) 弱类型语言-在定义变量时不需要显式地指明数据类型,编译器(解释器)会根据赋给变量的数据自动推导出类型...,并且可以赋给变量不同类型的数据。...var a = 100; //赋给整数 a = 12.34; //赋给小数 a = "heiren,HelloWorld"; //赋给字符串 a = new Array("JavaScript",

    2.5K30

    【C++之STL】一文学会使用 string

    1. 4 STL的重要性 在C++入门基础介绍(上)这篇博客中我提到过,C++的第一个正式版本的颁布曾因为STL的出现而延误: C++的标准化工作于1989年开始,并成立了一个ANSI和IS0(International...网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它,许多底层的数据结构以及算法都不需要自己重新造轮子,只有站在前人的肩膀上,才能健步如飞的快速开发。...2. 3 基本构造 string 类的成员其实和数据结构初阶中的顺序表是基本一样的,都是一个数组(只不过在 string 类中固定为char了),有一个指针,_size变量存储 string 中目前的数据个数...用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导...2. 11 字符串操作 c_str() (重要) 返回一个指向数组的指针,该数组包含以 null 结尾(即’\0’)的字符序列(即 C 字符串),表示 string 对象的当前值。

    19710

    Python笔记(二)——python调

    我们在Python中将使用import MyFirstPythonModule 来载入这个模块。这里我们将MyCppMethods作为模块要调用的方法,它是一个PyMethodDef结构。...我们可以看到这个结构的数组定义,{ "MyCppFunc", wrap_cmd_fun, METH_VARARGS, "Execute a shell command." }, 红色的就是我们在脚本里面要调用的函数名字...,它被映射为wrap_cmd_fun,当在Python脚本中调用MyCppFunc时将会调用wrap_cmd_fun函数。...数组的第二个元素{ NULL, NULL, 0, NULL } 表示函数列表结束,结束就用NULL。言外之意就是我们可以再这个结构数组中映射多个C/C++函数用于python来调用。...wrap_cmd_fun函数就不用我来解释了吧,一看就懂,就是将Python调用时传进来的参数转化成字符串,然后调用cmd函数,返回值是整型,又传回给python程序。

    61320

    【网络】Socket编程TCPUDP&&序列化和反序列化理解应用层(C++实现)&&Json::Value

    检查值是否为对象(即键值对的集合) 4.4.4 赋值和类型转换 Json::Value& operator=(bool value):将布尔值赋给 Json::Value 对象 Json::Value&...operator=(int value):将整数赋给 Json::Value 对象 Json::Value& operator=(unsigned int value):将无符号整数赋给Json::Value...对象 Json::Value& operator=(Int64 value):将 64 位整数赋给 Json::Value 对象 Json::Value& operator=(UInt64 value...):将 64 位无符号整数赋给 Json::Value 对象 Json::Value& operator=(double value):将双精度浮点数赋给 Json::Value 对象 Json::Value...& operator=(const char* value):将 C 字符串赋给 Json::Value 对象 Json::Value& operator=(const std::string& value

    17110

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小。...&a是数组的指针,其类型为int (*)[10](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(10个int型变量),值为数组a尾元素后一个元素的地址。...若(int *)p ,此时输出 *p时,其值为a[0]的值,因为被转为int *类型,解引用时按照int类型大小来读取。 17、数组名和指针(这里为指向数组首元素的指针)区别?...—一个代表地址的整数变量,是 const 或 volatile 的: char* const pchc; char* volatile pchv; 注意: 可以把一个非volatile int赋给volatile...int,但是不能把非volatile对象赋给一个volatile对象。

    2.6K40

    《逆袭进大厂》之C++篇49问49答

    因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小。...&a是数组的指针,其类型为int (*)[10](就是前面提到的数组指针),其加1时,系统会认为是数组首地址加上整个数组的偏移(10个int型变量),值为数组a尾元素后一个元素的地址。...若(int *)p ,此时输出 *p时,其值为a[0]的值,因为被转为int *类型,解引用时按照int类型大小来读取。 17、数组名和指针(这里为指向数组首元素的指针)区别?...—一个代表地址的整数变量,是 const 或 volatile 的: char* const pchc; char* volatile pchv; 注意: 可以把一个非volatile int赋给volatile...int,但是不能把非volatile对象赋给一个volatile对象。

    2K10

    【c++丨STL】string类的使用

    对象赋值给另一个string对象 string& operator=(const char* s); 将一个字符数组赋值给一个string对象 string& operator=(char c); 将一个字符赋值给一个...其结构中也有一个成员叫capacity,如果要插入数据,则会判断空间大小,空间不足则会提前申请空间供数组使用。...使用auto关键字的注意事项: 1. auto变量在定义时必须赋初值,否则编译器会报错。 2. 同一行声明多个auto变量时,所有初值的类型都必须相同。...assign assign的作用是给一个字符串赋一个新值,舍弃原来的值。他有八个重载函数: (1)string str副本。...npos具有size_t类型元素的最大可能值。 当在string的成员函数中作为len(或sublen)参数的值时,该值表示“直到字符串结束”。 作为返回值,它通常用于表示没有匹配。

    17810

    C++初阶:适合新手的手撕vector(模拟实现vector)

    上次讲了常用的接口:C++初阶:容器(Containers)vector常用接口详解 今天就来进行模拟实现啦 1.基本结构与文件规划 vector.h头文件:包含类的全部(函数的声明与定义) test.cpp...如果 n 大于当前的大小,它会调用 reserve 函数以确保数组有足够的容量,然后将数组的大小增加到 n,并使用值 x 进行初始化。...当使用迭代器遍历容器时,如果在遍历的过程中对容器进行了结构性的修改(例如插入、删除元素,重新分配内存等操作),可能会导致迭代器失效。...删除操作:当在容器中删除元素时,可能会导致容器内部的元素发生移动,也会导致原先的迭代器失效。因为删除元素后,原先的迭代器可能指向了一个已经被删除的元素,或者指向了不正确的位置。...迭代器失效可以大致分为两类: 结构性变化导致的失效:这类失效包括扩容时申请了新空间、插入或删除元素导致元素位置改变等情况。

    41710

    C++之类和对象

    自此结构体升级成了类,在类中定义的变量叫做成员变量,在类中定义的函数称为成员函数或者成员方法,不过一般C++定义类时更喜欢用“class”关键字。...析构函数不能重载) 4.对象生命周期结束时,C++编译系统系统自动调用析构函数; 5.析构函数对内置类型不处理,对自定义类型调用它自身的析构函数 可以看到,虽然我没有调用析构函数,但是编译器在..._a2的初始化写在前面,如果是按照声明顺序初始化的话,就应该是先初始化 _a1,也就是说此时 _a2的值还是一个随机值,而我用 _a2的值初始化 _a1得到的也就是一个随机值。...这个赋值并不是将a直接赋值给b的,而是根据b的类型产生了一个临时变量,将a的值赋给临时变量,再由临时变量赋值给b。...将临时变量赋值给d3的时候又要调用一次d3的构造函数,所以这个过程其实是拷贝构造+构造得到的,不过编译器做了优化跳过了拷贝构造的过程。但是如果你使用的是一些较老的编译器就可能没有优化。

    1.2K00

    【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘

    你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!...分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!  ...节点之间通过指针相连,形成链式存储结构。 动态内存分配 插入或删除节点时,只需调整指针,无需像数组那样移动大量元素。...动态内存管理 链表的每个节点在需要时动态分配内存。链表的容量只受限于系统内存,而不像数组需要提前分配固定大小的空间。 使用动态分配的方式,每个节点在内存中分散存储,无需连续内存空间。...(赋源码) 包括插入,删除,迭代器遍历等 namespace W { // 链表节点结构 template struct ListNode {

    17010
    领券