注:转载请标明原文出处链接: https://lvxiaowen.blog.youkuaiyun.com/article/details/107455531
1 对象数组
1.1 概念
现实中,只实例化1个对象通常不够用,需要实例化多个对象,可以通过对象数组来实现。
Coordinate coord[3]
:栈的实例化方式,用".
“调用;
Coordinate *p = new Coordinate[3]
:堆的实例化方式,用”p[].
“或”p->
"调用,一定要用delete []p
配套销毁。
1.2 示例
题目描述:
定义Coordinate类
(1)数据成员:m_iX和m_iY
(2)分别从堆和栈中实例化长度为3的对象数组
(3)给数组中的元素分别赋值
(4)遍历两个数组
Coordinate.h
#ifndef COORDINATE
#define COORDINATE
#include <iostream>
#include <string>
using namespace std;
class Coordinate
{
public:
Coordinate();
~Coordinate();
public:
int m_iX;
int m_iY;
};
#endif
Coordinate.cpp
#include <iostream>
#include "Coordinate.h"
using namespace std;
Coordinate::Coordinate()
{
cout << "Coordinate()" << endl;
}
Coordinate::~Coordinate()
{
cout << "~Coordinate()" << endl;
}
main.cpp
#include <iostream>
#include"Coordinate.h"
using namespace std;
int main(void)
{
//栈上实例化对象
Coordinate coor[3];
for (int k = 0; k < 3; k++)
{
coor[k].m_iX = k+1;
coor[k].m_iY = k+5;
}
//遍历
for (int i = 0; i < 3; i++)
{
cout << "(" << coor[i].m_iX<<",";
cout <<coor[i].m_iY<< ")" <<endl;
}
cout <<"------------------"<< endl;
//堆上实例化对象
Coordinate *p = new Coordinate[3];
p->m_iX = 10;
p->m_iY = 20;
p++; //等价于p=p+1;
p->m_iX = 40;
p[0].m_iY = 50; //因为执行了p++; 此时p[0]等价于原始的p[1]
p[1].m_iX = 60;
p = p + 1;
p->m_iY = 70;
p = p - 2; //复原
//遍历
for (int j = 0; j < 3; j++)
{
cout << "(" << p[j].m_iX << ",";
cout << p[j].m_iY << ")" << endl;
}
delete[]p;
p = NULL;
system("pause");
return 0;
}
运行结果:
2 对象成员
2.1 概念
对象成员是指在C++类定义中类的成员对象。A类的对象作为B类的成员属性出现,则我们称其为B类的一个对象成员。
描述直线需要定义2个类:定义坐标点的类和定义坐标段的类,如下图所示。
实例化时,先实例化A点坐标,再实例化B点坐标,最后实例化Line。销毁时顺序相反。
可以理解为先装零件,再封箱;先拆箱,再拿零件。
类成员为没有默认构造函数的类类型时,必须用到初始化成员列表,如下例所示。
2.2 示例
题目描述:
定义两个类
坐标类:Coordinate
(1)数据成员:m_iX和m_iY
(2)成员函数:构造函数、析构函数、数据封装函数
线段类:Line
(1)点A m_coorA、点B m_coorB
(2)成员函数:构造函数、析构函数、数据封装函数、信息打印函数
Coordinate.h
//Coordinate.h
#ifndef COORDINATE
#define COORDINATE
class Coordinate
{
public:
Coordinate(int x, int y);
~Coordinate();
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int m_iX;
int m_iY;
};
Coordinate.cpp
//Coordinate.cpp
#include <iostream>
#include "Coordinate.h"
using namespace std;
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
cout << "Coordinate()" << endl;
}
Coordinate::~Coordinate()
{
cout << "~Coordinate()" << endl;
}
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;
}
Line.h
//Line.h
#ifndef LINE
#define LINE
#include "Coordinate.h"
using namespace std;
class Line
{
public:
Line(int x1, int y1, int x2, int y2);
~Line();
void setA(int x, int y);
void setB(int x, int y);
void printInfo();
private:
Coordinate m_coorA;
Coordinate m_coorB;
};
#endif
Line.cpp
//Line.cpp
#include <iostream>
#include "Line.h"
using namespace std;
Line::Line(int x1, int y1, int x2, int y2) :m_coorA(x1, y1), m_coorB(x2, y2)
{
cout << "Line()" << endl;
}
Line::~Line()
{
cout << "~Line()" << endl;
}
void Line::setA(int x, int y)
{
m_coorA.setX(x);
m_coorA.setY(y);
}
void Line::setB(int x, int y)
{
m_coorB.setX(x);
m_coorB.setY(y);
}
void Line::printInfo()
{
cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;
cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;
}
main.cpp
#include <iostream>
#include <string>
#include "Line.h"
using namespace std;
int main(void)
{
Line *p = new Line(1, 2, 3, 4);
p->printInfo();
delete p;
p = NULL;
return 0;
}
运行结果: