拷贝

对象拷贝

帅比萌擦擦* 提交于 2020-02-23 09:47:26
浅拷贝; 概述: 拷贝就是拷贝指向对象的 指针 ,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存, // 人的对象; var Proson = { name: '小红', age: 18, score: 99, arr: [1, 2, 3, 4], interest: { song: '大约在冬季', skill: '技能', dance: '跳舞' } } // 学生的对象; var Student = {} // 利用for in 进行拷贝; for (const key in Proson) { Student[key] = Proson[key] } console.log(Proson) console.log(Student) 修改原对象的属性值; // 修改原对象的属性值; Proson.name = '赵丽颖' Proson.interest.skill = '射手' console.log(Proson) console.log(Student) // 打印的结果如下; 通过打印结果我们可以看到属性值是简单数据类型的那么数据的修改不会同步,但是属性值是引用类型的那么数据的修改便会同步;这是因为对于简单数据类型来说拷贝的是值,而对于复杂数据来说拷贝的只是引用的地址,指向的内存还是同一个;

C++学习6-变量生命周期

北慕城南 提交于 2020-02-23 01:31:30
变量生命周期 int main ( ) { Test t1 ( 10 ) ; Test t2 ; // => 不要写成 test t2() 会变成函数的声明 Test t3 ( t2 ) ; Test t4 = t3 ; //t3拷贝构造t4 // Test t5(40); Test t5 = Test ( 40 ) ; // 生成临时对象 Test(int) /* Test t5 = Test(40) 等于 Test t5(40)-- 是用临时对象 拷贝构造同类型的对象 临时对象不产生 直接构造对象即可 不是 :生成临时对象 拷贝构造t5 析构临时对象 */ cout << "-----------" << endl ; t2 = t3 ; // 赋值 t2 = Test ( 50 ) ; // 显式生成临时对象 //显式生成临时对象 这个临时对象是要产生的 然后给t2赋值 再析构临时对象 t2 = 50 ; // 隐式生成临时对象 int -> Test(int) //把其他类型转成类的类型 要看这个类有没有一个构造函数接收这个类型来生成临时对象 cout << "-----------" << endl ; return 0 ; } 介绍变量生命周期,先看看下面程序中函数对象的调用情况 原本程序: Test GetTestObject ( Test t ) { int val

C++构造函数和深拷贝与浅拷贝

痴心易碎 提交于 2020-02-22 23:51:17
构造函数 构造函数: · 对象被创建时 自动调用 · 函数名与类名相同 · 可以有形参,可以没有 · 可以重载 · 可以有默认参数值 · 可以是内联函数 · 不能有return语句 //构造函数的实现 Clock :: Clock(int newH,int newM,int newS):hour(newH),minite(newM),second(newS){ //类的成员变量初始化(prior) } 这样的初始化方式 ,效率高于表达式赋值 已有构造函数,还想让系统生成默认构造函数 语法: 类名() = default; 如果没有构造方法来初始化,便会使用内类初始值; 默认构造函数 Clock(); Clock(int newH = 1,int newM = 2); 这两种都是默认构造函数(不给参数都能调用),不能同时出现 委托构造函数 利于保持代码一致性。 形参列表不同,初始化列表不同,而其他的都是一样的。 Clock :: Clock(int newH,int newM,int newS):hour(newH),minite(newM),second(newS){ } Clock :: Clock():hour(0),minite(0),second(0){} 以上两个函数,初始化的过程是一样的 以上代码可以 使用 委托构造函数 简写为: Clock :: Clock(int

python学习笔记:数据类型——列表/数组(list)

心已入冬 提交于 2020-02-22 17:52:45
Python内置的一种数据类型是列表:list。 list是一种有序的集合,可以随时添加和删除其中的元素。通过下标访问列表中的元素(又称索引、角标),下标从0开始计数。 list定义,使用中括号[]。 list1 = [1,2,3,4] #一个普通的数组 list2 = ['marry','lily',[50,'monkey']] #二维数组 list3 = ['name','sex',['lily',124,['aaaa','bbb']]] #三维数组,嵌套几层就是几维 1、list的增、删、改、查 #增 name=['牛牛','帆帆','月月',666,'aaa',68.99]#定义一个list列表 name.append('小月')# 默认在最后面添加元素 print(name) name.insert(0,'小军')#指定下标位置添加元素 print(name) 执行结果如下: ['牛牛', '帆帆', '月月', 666, 'aaa', 68.99, '小月'] ['小军', '牛牛', '帆帆', '月月', 666, 'aaa', 68.99, '小月'] #改 name=['牛牛','帆帆','月月',666,'aaa',68.99]#定义一个list列表 print('修改之前:',name) name[0]='晓红'#指定下标0的元素修改成“晓红” print(

浅拷贝与深拷贝

元气小坏坏 提交于 2020-02-21 04:45:24
一、浅拷贝 1.1、浅拷贝指只拷贝一层,更深层次级别的只拷贝引用 <script> var obj = { id: 1, name: 'andy' msg:{ age: 16 } } var o = { for(var k in obj) { // k 是属性名 obj[k]是属性值 // 将对象obj中的值拷贝给对象o o[k] = obj[k] } } console.log(o) o.msg.age = 20 console.log(obj) // 当改变o中的age时obj中的age = 20 // 浅拷贝语法糖 // Object.assign(target,...sources) Object.assign(o,obj) // 将obj拷贝给o </script> 备注: 浅拷贝当遇见深层次的拷贝时只会将地址拷贝(而不是开辟新的地址) 二、深拷贝 2.1、深拷贝拷贝多层,每一级别的数据都拷贝 <script> var obj = { id: 1, name: 'andy' msg:{ age: 16 } } var o = {}; // 封装函数 function deepCopy(newobj,oldobj) { for(var k in oldobj) { // 判断我们的属性值属于那种数据类型 // 1、获取属性值 var item = oldobj[k] if

FastDFS安装与配置(一)

落花浮王杯 提交于 2020-02-20 00:34:14
Linux系统上FastDFS安装与配置 1. 相关依赖配置 1.需要安装 gcc yum install gcc-c++ 2.安装libevent【FastDFS依赖libevent库】 yum -y install libevent 3.安装libfastcommon 1. 将libfastcommonV1.0.7.tar.gz拷贝至/usr/local/下 2. tar -zxvf libfastcommonV1.0.7.tar.gz 3. cd libfastcommon-1.0.7 4. ./make.sh 5. ./make.sh install #将/usr/lib64下的库文件拷贝至/usr/lib下 6. ll /usr/lib64/ 4.安装libevent 1. 将libevent-2.0.15-stable.tar.gz 拷贝至/usr/local/下 2. tar -zxvf libevent-2.0.15-stable.tar.gz 3. cd libevent-2.0.15-stable/ 4. ./configure 5. make && make install 6. ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5 2. tracker编译安装 1.将FastDFS

超级DIY:制作运行在内存中的Linux系统

独自空忆成欢 提交于 2020-02-19 08:18:26
一般情况下,linux系统启 动过程是,写在MBR上的bootloader加载内核,然后加载初启环境,即initrd;在initrd中,一般有个叫init或linuxrc的脚 本(或ELF文件),该进程启动后,会先读取/etc/inittab下的内容,这是一个初始化表,用以确定执行/etc/rc.d下的哪个RC脚 本,RC脚本执行完毕后,文件系统基本上就得到所有的硬件信息了,进而加载真正的根分区。现在要做的是——将initrd作为根分区,这样,要做的事情主 要有四点:1.创建一个空间比较大的Ramdisk ,2.用busybox生成文件系统中必备的命令,用它的主要原因是占用空间小,3.添加或修改dev和etc下的文件,4.考虑添加一些应用程序,比如 ssh等。 操作系统:SlackWare12,内核版本:2.6.21.5-smp 1.创建一个空间比较大的Ramdisk #dd if=/dev/zero of=/tmp/ramdisk bs=1k count=92160 #losetup /dev/loop2 /tmp/ramdisk #mkfs.ext2 /dev/loop2 #mount -t ext2 /dev/loop2 /mnt 可以向/mnt下写东西了,然后 #umount /mnt 以后修改时,可以这样用 #gunzip ramdisk.gz //将initrd解压

Python攻关之深浅拷贝

孤者浪人 提交于 2020-02-18 20:32:10
浅拷贝 = 只拷贝第一层 深拷贝 = 克隆一份 s = [ 1 , 'zhang' , 'age' ] s2 = s . copy ( ) print ( s2 ) s2 [ 0 ] = 2 print ( s2 ) print ( s ) s = [ [ 1 , 2 ] , 'zhang' , 'age' ] s3 = s . copy ( ) print ( s3 ) s3 [ 1 ] = 'liu' print ( s3 ) print ( s ) s3 [ 0 ] [ 1 ] = 3 print ( s3 ) print ( s ) import copy husband = [ 'zhang' , 123 , [ 15000 , 9000 ] ] wife = husband . copy ( ) wife [ 0 ] = 'liu' wife [ 1 ] = 345 qu = copy . copy ( ) #浅拷贝 qu = copy . deepcopy ( husband ) #深拷贝 qu [ 0 ] = 'qu' qu [ 1 ] = 666 qu [ 2 ] [ 1 ] -= 1999 husband [ 2 ] [ 1 ] -= 3000 print ( wife ) print ( qu ) 来源: CSDN 作者: 去西天 链接: https:/

CopyOnWriteArrayList 源码解析和设计思路

百般思念 提交于 2020-02-18 20:04:21
引导语 在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征: 线程安全的,多线程环境下可以直接使用,无需加锁; 通过锁 + 数组拷贝 + volatile 关键字保证了线程安全; 每次数组操作,都会把数组拷贝一份出来,在新数组上进行操作,操作成功之后再赋值回去。 1 整体架构 从整体架构上来说,CopyOnWriteArrayList 数据结构和 ArrayList 是一致的,底层是个数组,只不过 CopyOnWriteArrayList 在对数组进行操作的时候,基本会分四步走: 加锁; 从原数组中拷贝出新数组; 在新数组上进行操作,并把新数组赋值给数组容器; 解锁。 除了加锁之外,CopyOnWriteArrayList 的底层数组还被 volatile 关键字修饰,意思是一旦数组被修改,其它线程立马能够感知到,代码如下: private transient volatile Object[] array; 整体上来说,CopyOnWriteArrayList 就是利用锁 + 数组拷贝 +

网卡

一笑奈何 提交于 2020-02-18 00:04:15
一、什么是网卡? 它是主机的网络设备,本身是LAN(局域网)的设备,通过网关、路由器等设备就可以把这个局域网挂接到Internet上。网卡工作在物理层和数据链路层的MAC子层,数据链路层还有LLC层,它在MAC层之上。 网卡按照数据链路层控制来分有以太网卡,令牌环网卡,ATM网卡等;按照物理层来分类有无线网卡,RJ-45网卡,同轴电缆网卡,光线网卡等等。它们的数据链路控制、寻址、帧结构等不同;物理上的连接方式不同、数据的编码、信号传输的介质、电平等不同。普通程序员常用的应该是以太网网卡。 以太网采用的CSMA/CD(载波侦听多路访问/冲突检测)的控制技术。他主要定义了物理层和数据链路层的工作方式。数据链路层和物理层各自实现自己的功能,相互之间不关心对方如何操作。二者之间有标准的接口(例如MII,GMII等)来传递数据和控制。 以太网卡的物理层可以包含很多种技术,常见的有RJ45,光纤,无线等,它们的区别在于传送信号的物理介质和媒质不同。(这些不太是程序员所关心的) 二、网卡的组成 1.网卡的基本结构 以太网网卡包括OSI(开方系统互联)模型的两个层。物理层和数据链路层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。