赋值

赋值操作符和拷贝构造函数

南笙酒味 提交于 2020-02-08 11:25:33
今天在看一个消息结构的定义类时,有一个这样的接口 WF_MSG & operator=(const WF_MSG & _msg); 开始不是很明白,后来才知道这是赋值操作符,也通过这个深刻了解了赋值操作符,因为还定义了一个unsigned char * m_pMsgBuffer; /// 消息缓存指针 的指针,一般默认的赋值操作符是浅拷贝,而因为有消息缓存指针的变量,当这个消息类有两个对象时,如果一个消息赋值给另外一个消息,则会涉及到深拷贝的问题,所以要重新定义赋值操作符 这里有一博客,叙述的很详细,给大家分享下: 赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。 CTemp a(b); //复制构造函数,C++风格的初始化 CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样 在这之前a不存在,或者说还未构造好。 CTemp a; a=b; //赋值运算符 在这之前a已经通过默认构造函数构造完成。 实例总结: 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。 以下讨论中将用到的例子: class CExample { public: CExample(){pBuffer

引用类型变量的赋值

我是研究僧i 提交于 2020-02-08 05:50:58
引用类型变量的相互赋值   代码: 1 Myclass obj1=new Myclass(){Valie=100};2 Mycalss obj2=null;3 obj2=obj1;//引用类型变量的赋值4 Console。WriteLine("obj1.Vlaue="+obj2.Value);5 //输出:obj2.Value=100 事实上两个引用类型的相互赋值意味着赋值后两个引用变量所占有的内存单元其内容是相同的。 讲的详细一些: 第一句创建Myclass对象以后,此Myclass对象所占用内存区域的首地址("假设为“1234 5678")被放入到变量obj1自身的内存单元中。 第二句有创建了一个对象变量obj2,其值最初为null(即对应的内存地址单元为”0000 0000“)。 第三句执行后,obj1变量的值被赋值到obj2的内存单元中,现在,obj2的内存单元的值也为“1234 5678”。 如果obj2.Value的值被修改相应的,obj1.Value的值也会跟着变化,因为它们两个其实是引用了同一个Myclass对象的同一个字段。 有此得出一个结论:    两个引用类型变量(假设它们都不为空)的相互赋值不会导致它们所引用的对象自身被复制,其结果是这两个引用类型的变量引用同一个对象。 (注意:由于C#变压器要求所有局部变量都要必须显示初始化,因此

C语言第三周

跟風遠走 提交于 2020-02-08 00:58:54
一. 字符串常量 只要有一对双引号括起来的字符序列就是字符串常量。列如“hello"接”123" 注意: “a"是字符串常量‘a'是字符常量。 二、字符串储存 字符串的结束标志是‘\0’。 列如: char str[6]={'h',‘e','l','l','o','0','\0'}; 三、学习过程中遇到的问题与解决 1、C语言中,为什么字符串可以赋值给字符指针变量? char *p,a='5'; p=&a; //显然是正确的, p="abcd" //但为什么也可以这样赋值? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,网上查资料学习了一下 答: 双引号做了3件事 : 1.申请了空间(在常量区),存放了字符串 2.在字符串尾加上了'/0' 3.返回地址 这里就是 返回的地址 赋值给了 p 二、char *p = “hello”; 上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了 解释: 字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。 所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。 char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的 如果写成char a[10] 然后 a = “hello” 这样就错误了。

移动构造函数和移动赋值与拷贝构造函数和赋值构造函数的比较

旧时模样 提交于 2020-02-07 20:37:51
首先看拷贝构造函数: //拷贝构造函数 A(A& t) { if(t.text!=NULL) { int len=strlen(t.text); text=new char[len+1]; strcpy(text,t.text); } } 拷贝构造函数中实现了深拷贝处理。再看移动构造函数: //移动构造函数 A(A&& t) { if(t.text!=NULL) { text=t.text; t.text=NULL; } }  代码构造和拷贝构造函数类似,但是内存的处理不是拷贝而是转移。注意参数类型是右值引用。 移动赋值运算符 赋值运算符的情况和构造函数类似,还是先考察普通的赋值运算符: //拷贝赋值运算符 A& operator=(const A& rhs) { if(this!=&rhs) { free(); if(rhs.text!=NULL) { int len=strlen(rhs.text); text=new char[len+1]; strcpy(text,rhs.text); } } return *this; } 再看移动赋值运算符: //移动赋值运算符 A& operator=(A&& rhs)noexcept { if(this!=&rhs) { free(); text=rhs.text; rhs.text=NULL; } reeturn *this; }

python运算符

回眸只為那壹抹淺笑 提交于 2020-02-07 20:12:43
算数运算符 算数运算符 描述 + 加 - 减 * 乘 / 除 % 取模,取余 ** 幂,返回x的y次幂 // 取整数 a=8 b=5 print(a+b) print(a-b) print(a*b) print(a/b) print(a%b) print(a//b) print(a**b) 13 3 40 1.6 3 1 32768 如果想要获取两数相除的整数和余数 可以使用dicmod print(divmod(10,3)) (3, 1) 赋值运算符 赋值运算符 描述 = 赋值运算符 += 加法赋值运算符 -= 减法赋值运算符 *= 乘法赋值运算符 /= 除法赋值运算符 %= 取模赋值运算符 **= 幂赋值运算符 //= 取整除赋值运算符 name1 = 'admin' name2 = name1 print(id(name1),name1) print(id(name2),name2) 2251004377664 admin 2251004377664 admin 在内存中创建admin,并将变量名name1指向该内存地址 将指向name1的内存空间指向变量name2 id函数,返回内存地址 num1 = 0 num1 += 5 # num1 = num1 + 5 print(num1) num1 -= 3 # num1 = num1 - 3 print(num1) num1

C++拷贝构造函数和拷贝赋值运算符问题

こ雲淡風輕ζ 提交于 2020-02-07 16:05:27
为什么需要析构函数就几乎需要拷贝构造函数和拷贝赋值运算符?或者说拷贝构造函数和拷贝赋值运算符什么时候需要自己构造? 答: 当类内出现指针时,为了防止浅拷贝,即只对指针变量进行拷贝,而不对指针指向的对象也进行复制。自定义拷贝构造函数是为了防止析构函数多次delete同一个指针对象,而自定义拷贝赋值运算符是为了防止在赋值后一个指针所指向对象改变值后不改变另一个指针对象的值。 需要自定义拷贝构造函数示例(可注释掉拷贝构造函数,看注释前后输出发生了什么变化) // // Created by raysuner on 20-2-2. // #include <iostream> using namespace std; class A{ private: string *str; public: explicit A(const string &s){ cout << "构造函数" << endl; str = new string(s); } A(const A &a){ cout << "拷贝构造函数" << endl; this->str = new string(*a.str); } ~A() {delete str; cout << "析构函数" << endl;} void print(){ cout << *(this->str) << endl; } }; A f(A a){

ant table中通过赋值取消选中值

和自甴很熟 提交于 2020-02-07 10:22:57
vue中table <a-table ref="table" size="middle" bordered rowKey="id" :columns="columns" :dataSource="dataSources" :pagination="ipagination" :loading="loading" :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, fixed: true}" @change="handleTableChange"> </a-table> js部分 methods: { transfer(values){ console.log("清除选中") //values为空数组 this.selectedRowKeys=values; }, } 将selectedRowKeys重新赋值即可改变选中状态 来源: https://www.cnblogs.com/eternityz/p/12271904.html

JavaSE学习笔记-Day6

痴心易碎 提交于 2020-02-07 07:41:37
昨天学完了面向对象的进阶内容,不过对面向对象还是没有什么感觉啊,不敢那么多了,继续往后学!今天我们学习一下数组。 一. 一维数组 数组这个概念就不陌生了,就不做实例来引进概念了。 数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。 数组的几大特点: 长度是确定的 。数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组类型可以是 任何数据类型 ,包括基本类型和引用类型。 数组变量属引用类型, 数组就是对象 ,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组对象本身是在堆中存储的。 接下来就来看看一维数组是如何声明的。一维数组的声明形式有两种: 数据类型 [ ] 数组名 ; //比方说我们一直在写的:String[] args 数据类型 数组名 [ ] ; 一般推荐使用上面的那种声明方式,Java要有Java的亚子。 注意事项 : 声明的时候就只是声明(在栈帧的局部变量表中有一个新变量),并没有实例化任何对象(堆是没有开辟新内存的),只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。 声明一个数组的时候并没有数组真正被创建。 构造一个数组,必须指定长度。 好了,既然声明的时候没有实例化对象,那么将数组实例化对象(初始化)的方法有哪些呢?

ES6

五迷三道 提交于 2020-02-07 06:05:03
在ES6中,新增了两种声明空间的方法,即前文中提及到的let和const 解构赋值 解构: 解开目标的整体结构 **赋值:**将目标中的数据 赋值到我们定义的变量中 每一个对象每个对象都可以有 若干的属性 / 方法(冒号赋值,逗号间隔、 最后一个属性 / 方法 不需要逗号) 可以通过点语法来访问对象中的变量 let obj = { a : 1 , == > let a = obj . a ; b : 2 == > let b = obj . b ; } 对象的解构赋值: { }中,名字必须和obj中保持一致,也就是说 变量名必须和属性名一致 let {a,b} = obj; 数组的解构赋值: 保持顺序一致 let arr = [ 1 , 2 , 3 , 4 , 5 ] ; let [ c , d , e , f ] = arr ; console . log ( c , d ) ; 数组的解构赋值: 变量名的存储顺序 和 字符串中存储的顺序一致 let str = "abc" ; let [ a , b ] = str ; console . log ( a , b ) ; 展开运算符: 将目标元素拷贝并在使用处展开 let arr1 = [ "a" , "b" , "c" , "d" ] ; let arr2 = [ 1 , 2 , 3 , ... arr1 , 4 , 5 ]