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_ ...
随机推荐
- nio案例一:个简单的客户-服务的案例
<Java NIO文档>非阻塞式服务器 原文连接 原文作者:Jakob Jenkov 译者:higher 即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel, ...
- 最大子数组(LintCode)
最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 注意 子数 ...
- Python安装scrapy提示 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools&quo ...
- 【Java多线程】线程池学习
Java线程池学习 众所周知,Java不仅提供了线程,也提供了线程池库给我们使用,那么今天来学学线程池的具体使用以及线程池基本实现原理分析. ThreadPoolExecutor ThreadPool ...
- 【Go】语法基础之结构体
结构体的定义很简单: type Vertex struct { X, Y float64 } 可以理解为多个变量的集合. 结构体的使用: 1.直接使用: v := Vertex{1, 2} 或 var ...
- 【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超 ...
- AtCoder - 3954 Painting Machines
题面在这里! 题解见注释 /* 考虑一个可以用 K ((n+1)/2 <= K < n)次染黑的方案, 那么将操作前K次的机器从小到大排序,一定是: a1=1 < a2 < . ...
- Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses
[题目链接] http://codeforces.com/problemset/problem/741/B [题目大意] 给出一张图,所有连通块构成分组,每个点有价值和代价, 要么选择整个连通块,要么 ...
- 【线段树】HDU1394 - Minimum Inversion Number
[题目大意] 给出0..n-1组成的一段数,可以移动前几个数到结尾.求出最小的逆序对个数. [思路] 先用线段树求出逆序对,方法和树状数组是一样的.然后对于当前第一个数num[0],在它之后比它小的数 ...
- [NOI2017]整数
[NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...