C++对象的赋值和复制

本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。

13.对象的赋值和复制

对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。注意:对象的赋值只是对其中数据成员的赋值,而不是对成员函数赋值。 对象1 = 对象2;//浅拷贝 浅复制

Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针
Box *b2;
b1 = b2; //浅拷贝
delete b1;
delete b2;//同一块地址 删了2次

Box b1 = Box(1, 2, 3);
Box b2;
b2 = b1;//位复制方式给b2赋值 想当于b1的内存完全copy给b1
//当这里给b2赋值时,回到时b2的p指针和b1的p指针指向同一个地方 即b1的p
//当程序运行结束时,会导致同一个内存在各自的析构函数中释放,累计释放了2次。

//深拷贝 深复制

补充:深拷贝和浅拷贝的区别: https://www.zhihu.com/question/36370072

对象的复制:用一个已有的对象快速地多个完全相同的对象。 //对象赋值:两个对象都已经存在,然后用一个对象给另一个对赋值 //对象复制:已经有一个对象,再创建另一个对象时,用已知的对象初始化创建对象

对象复制的一种形式:

Box box2(box1);//类名 对象2(对象1);
//用对象1复制出对象2 建立对象时调用了一个特殊的构造函数——copy构造函数(copy constructor)
//the copy constructor definition 详见课本101页
Box :: Box(const Box&b) {
    height = b.height;
    width = b.width;
    length = b.length;
}

对象复制的另一种形式:

Box box2 = box1;//类名 对象1 = 对象2;

两者区别: 对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行对象的赋值。而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象的完全相同(包括对象的结构和成员的值)。

 c3 = c1.complex_add(c2);//此处存在对象的赋值和复制问题

//对象的复制,存在于实参到形参以及函数的返回中

//实现机制实例
//重载=号实现对象赋值
Person& operator= (Person &s) {
    puts("oper");
    if(this == &s)  return s;
    char *t = new char[srelen(s.p) + 1];
    strcpy(t, s.p);
    delete []p;
    p = t;
    return this*;
}
//Copy构造函数实现对象复制
Person (const Person& s) {
    puts("cp cntr");
    p  = new char[strlen(s.p) + 1];
    strcpy(p, s.p);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏天天

数据类型的转换

12330
来自专栏猿人谷

qsort(),sort()排序函数

一.qsort()函数 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,...

26380
来自专栏python学习指南

python列表

本篇将介绍python中的列表,更多内容请参考:Python学习指南 一、序列 在python中有六种内建的序列:列表、元祖、字符串、Unicode字符串...

38450
来自专栏Python入门

Python函数式编程-高阶函数、匿名函数、装饰器、偏函数

本篇文章我们来介绍下Python函数式编程的知识。最主要的一点,Python中的函数是对象,可以复制给变量!好了,我们来介绍几个Python函数式编程中的要点,...

12820
来自专栏Android干货

Python高级特性:迭代

--------------------------------------------------------------------------------...

8710
来自专栏算法channel

Python|高阶函数

01 函数名也是变量! abs(-100) 对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个计算绝对值的函数! 因此,函数名其实就是指向...

38760
来自专栏我爱编程

Day5函数式编程1/3

高阶函数 map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返...

29880
来自专栏玄魂工作室

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字

要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和...

26110
来自专栏测试开发架构之路

C++之类和对象的使用(三)

对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数...

34390
来自专栏Brian

C++ Virtual And Pure Virtual Explained

---- Virtual Virtual Function是成员函数,其行为在派生类中被覆盖。与非虚函数不同的是,即使没有关于类的实际类型的编译时信息,也会保留...

35960

扫码关注云+社区

领取腾讯云代金券