(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++中的对象复制的更多相关文章

  1. 【转】JavaScript中的对象复制(Object Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...

  2. JavaScript 中的对象深度复制(Object Deep Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...

  3. PHP基础知识之对象复制

    对象的复制默认为浅复制 进行深复制的方法为:在类中定义魔法方法__clone(),类的对象复制时,会自动调用 __clone方法,在 __clone方法中可以进行各种复制对象的个性化 class My ...

  4. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  5. 基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象

    1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧 ...

  6. JS对象复制

    在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...

  7. js中的深复制和浅复制

    在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...

  8. C++中实现对象的clone()

    在C#中,许多对象自动实现了clone函数,在C++中,要拷贝一个对象,除了自定义一个拷贝构造函数来实现对象复制外,还可以像C#中那样实现一个clone函数,这需要借助编译器实现的一个隐藏拷贝构造函数 ...

  9. 对象复制问题 && lvalue-rvalue && 引用

    按值传递实参到函数和函数返回临时变量的副本,函数的效率对执行性能来说至关重要 如果避免这样的复制操作,则执行时间可能会大大缩短. class CMessage { private: char * m_ ...

随机推荐

  1. scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写

    在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写. 在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流 本篇目标:让拉勾网爬 ...

  2. Git的入门级玩法

    作为一个还没有实际开发经验的程序员,对于版本控制多少有些陌生,我通常的做法就是项目名后面加数字标记版本,然后备注一个文档说明更新.据个人了解svn用的比较多,我也学习了一点,无非是本地下载一个服务器端 ...

  3. EXISTS运算符

    和IN.ANY.ALL等运算符不同,EXISTS运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的.EXISTS运算符用来检查每一行是否匹配子查询,可以认为EXISTS就是用来测试子 ...

  4. Xamarin XAML语言教程模板视图TemplatedView(二)

    Xamarin XAML语言教程模板视图TemplatedView(二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于中TemplatedView.代码如下: <? ...

  5. PHP:过滤数组中为空的值,并将返回的数组使用数值键,从 0 开始并以 1 递增

    首先了解下以下两个函数: 1.array_filter() 函数用回调函数过滤数组中的值. 2.array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名.(被返回的数组将使 ...

  6. [P4064][JXOI2017]加法(贪心+树状数组+堆)

    题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...

  7. [xsy2880]取石子游戏

    题意:有$n$堆石子,每堆石子数量相同,以质因数分解给出,不停地从$1$到$n$依次拿石子,使得取完后石子个数为原来的因数(不能不取),当一堆只剩$1$个时结束,问在每堆石子结束的方案数 记石子个数为 ...

  8. codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品

    1959 拔河比赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 一个学校举行拔河比赛,所有的 ...

  9. POJ 3422 Kaka's Matrix Travels(费用流)

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6792   Accepted:  ...

  10. Android获取apk的版本及包名等信息

    import android.app.Activity; import android.content.Context; import android.content.pm.ApplicationIn ...