• 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对象共享相同的存储空间,不会再执行  返回对象的析构函数,因而不会出错了。

    说明:在设计一个类时,如果含有指针数据成员,那么成员函数中的对象形参通常采用引用类型,否则出现错误

  • 相关阅读:
    Xenu Link Sleuth简单使用
    C#简单游戏外挂制作(以Warcraft Ⅲ为例)
    Silverlight InkPresenter 实现路径回放的探索
    Microsoft Virtual Earth Silverlight Map Control (CTP)快速上手
    【Azure实例】有趣的Silverlight应用:录播简笔画
    Azure Services Platform 入门系列文章索引页
    javascript原型的类继承
    javascript给类添加的方法
    checkbox 全选
    【nodejs】 在 Ubuntu 12.04 安裝 Node.js【转】
  • 原文地址:https://www.cnblogs.com/hoobey/p/5388814.html
Copyright © 2020-2023  润新知