天天看點

c++慕課網3

深拷貝淺拷貝

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;
}
           

對象指針

c++慕課網3

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;
}
           

對象成員指針

c++慕課網3

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指針

c++慕課網3

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;//不需加*,傳回對象
}
           

結果:

c++慕課網3
c++慕課網3

走出迷宮

c++慕課網3

這裡寫圖檔描述