(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. Java GlassPane进度条遮罩

    package com.swing.demo; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Flo ...

  2. [Arc062] Painting Graphs with AtCoDeer

    [Arc062] Painting Graphs with AtCoDeer Description 给定一张N点M边的无向图,每条边要染一个编号在1到K的颜色.你可以对一张染色了的图进行若干次操作, ...

  3. 【BFS】【位运算】解药还是毒药

    [codevs2594]解药还是毒药 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别 ...

  4. [UOJ181]密码锁

    这个完全图随机定向后是一个竞赛图,将它的强连通分量缩点后我们得到的东西类似一条链,每个点往它后面的所有点连边 在这条链上,我们可以把点划分为两个点集$S,T$使得没有从$T$中点到$S$中点的边($S ...

  5. 【模拟退火】Petrozavodsk Winter Training Camp 2017 Day 1: Jagiellonian U Contest, Monday, January 30, 2017 Problem F. Factory

    让你在平面上取一个点,使得其到给定的所有点的距离和最小. 就是“费马点”. 模拟退火……日后学习一下,这是从网上扒的,先存下. #include<iostream> #include< ...

  6. while an existing transition or presentation is occurring; the navigation stack will not be updated

    使用UIAlertController提示信息,在之后使用navigation进行逻辑跳转时,出现popToViewController:transition: called on <UINav ...

  7. GCC编绎详解

    http://www.cnblogs.com/lisuyun/p/4169395.html http://blog.csdn.net/kai_gai/article/details/45689247 ...

  8. 原生js操作HTML DOM

    先上图 1.一些常用的方法 obj.getElementById() 返回带有指定 ID 的元素. obj.getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表( ...

  9. iOS-Runtime、对象模型、消息转发

    Objective-C只是在C语言层面上加了些关键字和语法.真正让Objective-C如此强大的是它的运行时.它很小但却很强大.它的核心是消息分发. Message 执行一个方法,有些语言.编译器会 ...

  10. 【LaTeX】E喵的LaTeX新手入门教程(3)数学公式

    昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er ...