c++中的对象复制
(1)this指针
this是一个隐含于每个类的成员函数的特殊指针,该指针是一个指向正在被某个成员函数操作的对象的指针。
当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,也就是说,当调用成员函数时,this被初始化为被调用的成员函数所在的类实例,即对象的地址,然后调用
成员函数,每次成员函数存取数据成员时,隐含使用this指针。通常,不显式地使用this指针。
this指针是c++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数
class Myclass{ int n; public: Myclass(); //默认构造函数 Myclass(int m); //重载构造函数 void addvalue(int x); //增加x值 void disp(); //输处数据成员n };
Myclass::Myclass(){} Myclass::Myclass(int m){ n = m; }
void Myclass::addvalue(int x){ Myclass s1; s1.n = n + x; //this指针:是一个隐含于每个类的成员函数的特殊指针,该指针是一个指向正在被某个成员函数操作的对象的指针 *this = s1; }
void Myclass::disp(){ cout<<"n=:"<<n<<endl; }
void main(){ Myclass s(10); s.disp(); s.addvalue(5); s.disp(); }
(2)对象的浅复制与深复制
#include<iostream.h> #include"string.h"
class StudClass{ int no; char *pname; public: StudClass(); StudClass(int n,char *p); ~StudClass(); void display();
StudClass & operator=(StudClass &s); };
StudClass::StudClass(){} StudClass::StudClass(int n,char *p){ no = n; pname = new char[10]; strcpy(pname,p); } StudClass::~StudClass(){ delete []pname; }
void StudClass::display(){ cout<<"学号:"<<no<<",姓名:"<<pname<<endl; } /*重载运算符“=”实现深复制 //改正方法是采用深复制,当两个对象之间进行复制时,若复制完成后,它们不会共享任何资源(空间),其中一个对象的销毁不会影响另一个对象 StudClass& operator=(StudClass &s){ pname = new char[10]; no = s.no; strcpy(pname,s.pname); return *this; } */ void main(){ StudClass s(10,"hubin"),t; t = s; //重大错误!!该语句执行的是浅复制,s和t这两个对象的pname数据成员均指向相同的内存空间,在执行t的析构函数之后, //t.pname所指向的空间被释放,这样再执行s的析构函数就出错了 cout<<"s:"; s.display(); cout<<"t:"; t.display(); }
/* 两点说明: 1.运算符重载函数中的形参s一定采用引用类型。在该函数中并没有改变形参s的任何值,也不需要形参s实现双向传递,为什么非要采用引用类型呢? 如何不采用引用类型,在调用该函数时,需要将实参对象复制到形参s对象,而这种复制也是浅复制,并不会为形参s的pname分配所指向的空间, 导致实参和形参s对象的pname所指向的空间相同,在调用析构函数时出错。
2.运算符重载函数时,函数的返回值是StudClass&,即对象引用,如果不引用也会出错,这是为什么呢? 因为在执行“t=s;”时,相当于执行“t.=(s)”,如果不采用引用返回值,还需要将=(s)的返回对象复制给t对象,这种复制也是浅复制,该返回 对象和t对象的pname指向相同的空间,在两次调用析构函数时会出错,若用引用返回值,=(s)的返回对象和t对象共享相同的存储空间,不会再执行 返回对象的析构函数,因而不会出错了。
说明:在设计一个类时,如果含有指针数据成员,那么成员函数中的对象形参通常采用引用类型,否则出现错误
c++中的对象复制的更多相关文章
- 【转】JavaScript中的对象复制(Object Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...
- JavaScript 中的对象深度复制(Object Deep Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...
- PHP基础知识之对象复制
对象的复制默认为浅复制 进行深复制的方法为:在类中定义魔法方法__clone(),类的对象复制时,会自动调用 __clone方法,在 __clone方法中可以进行各种复制对象的个性化 class My ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- 基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象
1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧 ...
- JS对象复制
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
- js中的深复制和浅复制
在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...
- C++中实现对象的clone()
在C#中,许多对象自动实现了clone函数,在C++中,要拷贝一个对象,除了自定义一个拷贝构造函数来实现对象复制外,还可以像C#中那样实现一个clone函数,这需要借助编译器实现的一个隐藏拷贝构造函数 ...
- 对象复制问题 && lvalue-rvalue && 引用
按值传递实参到函数和函数返回临时变量的副本,函数的效率对执行性能来说至关重要 如果避免这样的复制操作,则执行时间可能会大大缩短. class CMessage { private: char * m_ ...
随机推荐
- Java面向对象和特征
面向对象: 概念: 面向对象是一种程序设计思想,计算机程序的设计实质上就是将现实中的一些事物的特征抽离出来描述成一些计算机事件的过程,这种抽象的过程中,我们把具体的事物封装成一个一个的整体进行描述,使 ...
- Hibernate 与Spring整合出现 hibernate.HibernateException: createCriteria is not valid without active transaction
当 Hibernate 和 Spring 整合时,在 Spring 中指定的 Hibernate.cfg.xml 文件内容中要注释掉以下内容: <!-- Enable Hibernate's a ...
- 线段树+扫描线【bzoj1645】[USACO07OPEN]城市的地平线City Horizon
Description 约翰带着奶牛去都市观光.在落日的余晖里,他们看到了一幢接一幢的摩天高楼的轮廓在地平线 上形成美丽的图案.以地平线为 X 轴,每幢高楼的轮廓是一个位于地平线上的矩形,彼此间可能有 ...
- CSS中包含块原理解析
CSS包含块原理解析 确定CSS中的包含块也确定就是元素的父元素.关键是:看元素是如何定位的.确定包含块很重要,比如设置百分比.另外也可以进行样式的继承等等. 分两个情况: 相对定位和静态定位 静态定 ...
- centos 7 的安全检查和ip封锁设置
查看最近登录失败的验证记录 tail -f grep "authentication failure;" /var/log/secure 发现有个ip频繁尝试登录, /sbin/i ...
- zoj 1375||poj 1230(贪心)
Pass-Muraille Time Limit: 2 Seconds Memory Limit: 65536 KB In modern day magic shows, passing t ...
- 【BZOJ 4513】【SDOI 2016】储能表
http://www.lydsy.com/JudgeOnline/problem.php?id=4513 设\(f(i,0/1,0/1,0/1)\)和\(g(i,0/1,0/1,0/1)\)分别表示d ...
- [BZOJ2337][HNOI2011]XOR和路径(概率+高斯消元)
直接不容易算,考虑拆成位处理. 设f[i]表示i到n的期望路径异或和(仅考虑某一位),则$f[y]=\sum\limits_{exist\ x1\to y=0}\frac{f[x1]}{d[x1]}+ ...
- 【BFS】bzoj2252 [2010Beijing wc]矩阵距离
要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止. #include<cstdio> #include<queue> #include ...
- 1.3 (JavaScript学习笔记)JavaScript对象
在JavaScript中所有事物都是对象,字符串.数值.数组.函数...等, JavaScript还允许自定义对象.这些在1.1中有所介绍. 一.遍历对象属性 <!DOCTYPE html> ...