深拷贝浅拷贝

第一问:
Array.h
class Array
{
public:
Array();
Array(const Array&arr);
~Array();
void setCount(int count);
int getCount();
private:
int m_iCount;
};
Array.cpp
#include<iostream>
#include"Array.h"
using namespace std;
Array::Array()
{
cout << "Array" << endl;
}
Array::Array(const Array &arr)
{
m_iCount = arr.m_iCount;
cout << "Array&" << endl;
}
Array::~Array()
{
cout << "~Array" << endl;
}
void Array::setCount(int count)
{
m_iCount = count;
}
int Array::getCount()
{
return m_iCount;
}
demo.cpp
#include<iostream>
#include<stdlib.h>
#include"Array.h"
using namespace std;
int main(void)
{
Array arr1;
arr1.setCount(5);
Array arr2(arr1);
cout << "arr2.m_iCount"<<arr2.getCount() << endl;
system("pause");
return 0;
}
第二问:
Array.h
class Array
{
public:
Array(int count);
Array(const Array&arr);
~Array();
void setCount(int count);
int getCount();
void printAddr();
void printArr();
private:
int m_iCount;
int *m_pArr;
};
Array.cpp
#include<iostream>
#include"Array.h"
using namespace std;
Array::Array(int count)
{
m_iCount = count;
m_pArr = new int[m_iCount];
for (int i = 0; i < m_iCount; i++)
{
m_pArr[i] = i;
}
cout << "Array" << endl;
}
Array::Array(const Array &arr)
{
m_iCount = arr.m_iCount;
m_pArr = new int[m_iCount];
for (int i = 0; i < m_iCount; i++)
{
m_pArr[i] = arr.m_pArr[i];
}
cout << "Array&" << endl;
}
Array::~Array()
{
delete[]m_pArr;//arr1,arr2各删除一遍
m_pArr = NULL;
cout << "~Array" << endl;
}
void Array::setCount(int count)
{
m_iCount = count;
}
int Array::getCount()
{
return m_iCount;
}
void Array::printAddr()
{
cout << "m_pArr的值是:" << m_pArr << endl;
}
void Array::printArr()
{
for (int i = 0; i < m_iCount; i++)
{
cout << m_pArr[i]<<endl;
}
}
demo.cpp
#include<iostream>
#include<stdlib.h>
#include"Array.h"
using namespace std;
int main(void)
{
Array arr1(5);
Array arr2(arr1);
arr1.printArr();
arr1.printArr();
system("pause");
return 0;
}
对象指针
Coordinate.h
class Coordinate
{
public:
Coordinate();
~Coordinate();
public:
int m_iX;
int m_iY;
};
Coordinate.cpp
#include<iostream>
#include"Coordinate.h"
using namespace std;
Coordinate::Coordinate()
{
cout << "Coordinate" << endl;
}
Coordinate::~Coordinate()
{
cout << "~Coordinate" << endl;
}
demo.cpp
#include<iostream>
#include<stdlib.h>
#include"Coordinate.h"
using namespace std;
int main(void)
{
//堆中:
Coordinate *p1 = NULL;//定义一个对象指针,指向NULL
p1 = new Coordinate;
Coordinate *p2 = new Coordinate;//Coordiante的后面加不加()都是对的
p1->m_iX = 10;
p1->m_iY = 20;
(*p2).m_iX = 30;
(*p2).m_iY = 40;
cout << p1->m_iX + (*p2).m_iX << endl;
cout << p1->m_iY + (*p2).m_iY << endl;
delete p1;
p1 = NULL;
delete p2;
p2 = NULL;
//栈中:
// Coordinate p1;
//Coordinate *p2 = &p1;//让P2来指向P1
//p2->m_iX = 10;
//P2->m_iY = 20;
//cout << p1.m_iX << endl;
//cout << p1.m_iY << endl; //结果是10,20,通过p2可以操作p1
system("pause");
return 0;
}
对象成员指针
demo.cpp
#include<iostream>
#include<stdlib.h>
#include"Line.h"
using namespace std;
int main(void)
{
Line *p=new Line(1,2,3,4);
p->printInfo();//将两个坐标打印出来
delete p;
p =NULL;
cout<<sizeof(p)<<endl;
cout<<sizeof(Line)<<endl;
system("pause");
return 0;
}
Coordinate.h
class Coordinate
{
public:
Coordinate(int x,int y);
~Coordiante();
int getX();
int getY();
private:
int m_iX;
int m_iY;//两个数据成员,横坐标纵坐标
};
Coordinate.cpp
#include<iostream>
#include"Coordiate.h"
using namespace std;
Coordinate::Coordiante(int x,int y)
{
m_iX=x;
m_iY=y;
cout<<"Coordiante()"<<m_iX<<","<<m_iY<<endl;
}
Coordiante::~Coordiante()
{
cout<<"~Coordinate()"<<m_iX<<","<<m_iY<<endl;
}
int Coordiante::getX()
{
return m_iX;
}
int Coordiante::getY()
{
return m_iY;
}
Line.h
#include "Coordinate.h"
class Line
{
public:
Line(int x1,int y1,int x2,int y2);
~Line();
void printInfo();
private:
Coordiante *m_pCoorA;
Coordiante *m_pCoorB;
};
Line.cpp
#include<iostream>
#include"Line.h"
using namespace std;
Line::Line(int x1,int y1,int x2,int y2)
{
m_pCoorA=new Coordianate(x1,y1);
m_pCoorB=new Coordiante(x2,y2);
cout<<"Line()"<<endl;
}
Line::~Line()
{
delete m_pCoorA;
m_pCoorA=NULL;
delete m_pCoorB;
m_pCoorB=NULL;
cout<<"~Line()"<<endl;
}
void Line::printInfo()
{
cout<<"printInfo()"<<endl;
cout<<"("<<m_pCoorA->getX()<<","<<m_pCoorA->getY()<<")"<<endl;
cout<<"("<<m_pCoorB->getX()<<","<<m_pCoorB->getY()<<")"<<endl;
}
this指针
Array.h
class Array
{
public:
Array(int len);
~Array();
void setLen(int len);
int getLen();
void printInfo();
private:
int len;//m_iLen;
};
Array.cpp
#include<iostream>
#include"Array.h"
using namespace std;
Array::Array(int len)
{
this->len = len;//m_iLen = len;
}
Array::~Array()
{
}
void Array::setLen(int len)
{
this->len = len;//m_iLen = len;
}
int Array::getLen()//来获取len的值,把他打印出来
{
return len;//return m_iLen;
}
void Array::printInfo()
{
}
demo.cpp
#include<iostream>
#include<stdlib.h>
#include "Array.h"
using namespace std;
int main(void)
{
Array arr1(10);//会赋值给数据成员m_Len=10
cout << arr1.getLen() << endl;
system("pause");
return 0;
}
更改程序,利用引用&
demo.cpp
#include<iostream>
#include<stdlib.h>
#include "Array.h"
using namespace std;
int main(void)
{
Array arr1(10);//会赋值给数据成员m_Len=10
arr1.printInfo().setLen(5).printInfo();//arr1.printInfo();这条语句打印出来的是10,现在改变加上set.len(5),结果未发生改变len=10(两遍)
//printInfo()的返回值return *this出来之后变成了另外一个对象,这个对象是一个临时的对象,并不arr1;将Array ArrayprintInfo()加上引用&
//第一个printInfo调用10,第二个printInfo调用5,都是针对arr1的操作
system("pause");
return 0;
}
Array.h
#pragma once
class Array
{
public:
Array(int len);
~Array();
Array & setLen(int len);
int getLen();
Array& printInfo();//Array printInfo();加上引用 //void printInfo();
private:
int len;//m_iLen;
};
Array.cpp
#include<iostream>
#include"Array.h"
using namespace std;
Array::Array(int len)
{
this->len = len;//m_iLen = len;
}
Array::~Array()
{
}
Array&Array::setLen(int len)//void Array::setLen(int len)
{
this->len = len;//m_iLen = len;
return *this;//别忘了
}
int Array::getLen()//来获取len的值,把他打印出来
{
return len;//return m_iLen;
}
Array&Array::printInfo()//Array Array ::printInfo()加上引用//void Array::printInfo()
{
cout << "len=" << len << endl;
return *this;//指针变对象;要求的返回值为Array
}
更改程序,利用指针*;无论通过指针还是引用都可以改变参数的值
demo.cpp
#include<iostream>
#include<stdlib.h>
#include "Array.h"
using namespace std;
int main(void)
{
Array arr1(10);//会赋值给数据成员m_Len=10
arr1.printInfo();//this指针打印的地址值
cout << &arr1 << endl;//看看值是否相同,结果相同
//arr1.printInfo()->setLen(5)->printInfo();//变为指针符号同样可以输出
system("pause");
return 0;
}
Array.h
class Array
{
public:
Array(int len);
~Array();
Array * setLen(int len);
int getLen();
Array*printInfo();
private:
int len;//m_iLen;
};
Array.cpp
#include<iostream>
#include"Array.h"
using namespace std;
Array::Array(int len)
{
this->len = len;//m_iLen = len;
}
Array::~Array()
{
}
Array*Array::setLen(int len)//void Array::setLen(int len)
{
this->len = len;//m_iLen = len;
return this;//别忘了
}
int Array::getLen()//来获取len的值,把他打印出来
{
return len;//return m_iLen;
}
Array*Array::printInfo()//Array Array ::printInfo()加上引用//void Array::printInfo()
{
cout << this<< endl;//打印this指针的地址,说明this指针本质上就代表对象本身的地址
return this;//不需加*,返回对象
}
结果:
走出迷宫
这里写图片描述