C++对象数组和对象成员
对象数组
例子:
class Coordinate
{
public:
int m_iX;
int m_iY;
};
int main(void)
{
Coordinate coord[3];
coord[1].m_iX = 10;
Coordinate *p = new Coordinate[3];
p[0].m_iY = 20; //等价于p->m_iY = 20;
delete []p;
p=NULL;
return 0;
}
对象成员
初始化时先初始化成员对象,再初始化总对象,销毁时先销毁总对象再销毁其中成员对象。
//使用对象成员的例子
//demo.cpp
#include<iostream>
#include<stdlib.h>
#include "Line.h"
using namespace std;
int main(void)
{
Line *p =new Line();
delete p;
p=NULL;
system("pause");
return 0;
}
//Line.cpp
#include "Line.h"
void Line::setA(int x,int y)
{
m_coorA.setX(x);
m_coorA.setY(y);
}
void setB(int x,int y)
{
m_coorB.setX(x);
m_coorB.setY(y);
}
void Line::printInfo()
{
cout << "("<< m_coorA.getX()<<","<<m_coorA.getY()<<")"<<endl;
}
//Line.h
#include "Coordinate.h"
class Line
{
public:
Line(){}
~Line(){}
void setA(int x,int y);
void setB(int x,int y);
void printInfo();
private:
Coordinate m_coorA;
Coordinate m_coorB;
};
//Coordinate.cpp
#include "Coordinate.h"
void Coordinate::setX(int x)
{
m_iX = x;
}
int Coordinate::getX()
{
return m_iX;
}
void Coordinate::setY(int y)
{
m_iY = y;
}
int Coordinate::getY()
{
return m_iY;
}
//Coordinate.h
class Coordinate
{
public:
Coordinate(){}
~Coordinate(){}
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int m_iX;
int m_iY;
};
C++深拷贝与浅拷贝
如何实现拷贝构造函数并不简单,对象间的拷贝大致为为两种情况,深拷贝和浅拷贝。
深拷贝
当进行对象拷贝时,不是简单的做值的拷贝,而是将堆中内存的数据也进行拷贝,这种拷贝模式就叫做深拷贝。
浅拷贝
只是将数据成员的值进行了简单的拷贝。
如果遇到指针的时候,仅拷贝了地址,因此两个指针指向了同一个内存地址,我们希望的并不是这样,我们所期望的是,指向另一个地址空间,但是将原指针指向的地址当中的内容复制了过来。因此需要考虑使用深拷贝。
C++对象指针
C++中的new会自动的调用相关对象的构造函数,而在C语言中使用malloc只会分配相关内存并不会自动调用对象的构造函数。
//简单例子
//已经定义了一个Coordinate类
Coordinate *p1 = NULL;
p1 = new Coordinate();
Coordinate *p2 =new Coordinate();
p1->m_iX=10;
p1->m_iY=20;
//不同的方法,意义一样
(*p2).m_iX=30;
(*p2).m_iY=40;
delete p1;
p1 = NULL;
delete p2;
p2 = NULL;
对象成员指针
对象的指针作为另外一个类的对象成员。
指针类型占4个基本内存单元
//前提已经申明好Coordinate类
//Line.h
#include "Coordinate.h"
class Line
{
public:
Line(int x1,int y1,int x2,int y2);
~Line();
void printInfo();
private:
Coordinate *m_pCoorA;
//在构造函数中去实例化这个对象
//在析构函数中去删除这两个对象
Coordinate *m_pCoorB;
};
this指针
Array arr1
this 等价于&arr1
class Array
{
public:
Array(int len){this->len=len;}
int getLen(){return len;}
void setLen(int len){this->len=len;}
private:
int len;
};
const关键字(在c++笔记Ⅰ出现过基础部分)
常对象成员和常成员函数
class Coordinate
{
public:
Coordinate(int x,int y);
void changeX() const; //常成员函数
void changeX();
private:
int m_iX;
int m_iY;
};
//常对象成员
class Line
{
public:
Line(int x1,int y1,int x2,int y2);
private:
const Coordinate m_coorA;
const Coordinate m_coorB;
};
//常对象
const Line line(1,2,3,4);
//常对象会调用常成员函数
对象的常指针和常引用
Coordinate coor1(3,5);
//对象的常引用
const Coordinate &coor2 =coor1;
//对象的常指针
const Coordinate *pCoor =&coor1;