c++慕课网3

深拷贝浅拷贝这里写图片描述
第一问:
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;//不需加*,返回对象
}

结果:
这里写图片描述
这里写图片描述

走出迷宫
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值