对象数组
上图为在栈中及堆中实例化数组的例子
实现如上图的代码,具体如下
先在当前project下创建一个类
输入类名Coordinate
,会自动生成的Coordinate.h
和Coordinate.cpp
文件
在出现的Coordinate.h
文件输入如下代码
#ifndef COORDINATE_H
#define COORDINATE_H
class Coordinate
{
public:
Coordinate();
virtual ~Coordinate();
int m_ix;
int m_iy;
};
#endif // COORDINATE_H
在出现的Coordinate.cpp
文件输入如下代码(类外定义)
#include "Coordinate.h"
Coordinate::Coordinate()
{
cout<<"Coordinate"<<endl;/ctor
}
Coordinate::~Coordinate()
{
cout<<"123Coordinate"<<endl;//dtor
}
在主程序main.cpp
中输入代码
#include <iostream>
#include<stdlib.h>
#include <string.h>
#include "Coordinate.h"
using namespace std;
int main(void)
{
Coordinate coor[3]; //栈实例化
coor[0].m_ix=3;
coor[0].m_iy=5;
Coordinate *p=new Coordinate[3]; //堆实例化
// 这里实例化之前忘记加上[3],运行后无法输出析构函数的内容
p->m_ix=7; //是对数组的第一个元素操作
p[0].m_iy=9; //也是对数组第一个元素操作
p++; //p=p+1 p+=1 指针指向了第二个元素
p->m_ix=11; //对第二个元素赋值
p[0].m_iy=13; //这时候通过索引[0]是第二个元素,要访问第一个元素不能通过索引
p[1].m_ix=15; //对第三个元素操作
p++; //p指向第三个元素
p->m_iy=17;
for(int i=0;i<3;i++) //遍历输出第一个用栈实例化的数组
{
cout<<"coor_x"<<coor[i].m_ix<<endl;
cout<<"coor_y"<<coor[i].m_iy<<endl;
}
for(int j=0;j<3;j++)
{
//如果p没有经过p++这步,可以写成如下
/*cout<<"p_x"<<p[j].m_ix<<endl;
cout<<"p_y"<<p[j].m_iy<<endl; */
cout<<"p_x"<<p->m_ix<<endl; //输出当前p指向的内容
cout<<"p_x"<<p->m_iy<<endl;
p--; //由于p加了两次,p--相当于逐步减回去
}
//释放内存不能直接写成 delete []p; 因为释放的内存不是前面申请的内存了
p++; //最后循环多减了一次p,再加回来 回到初始的p
delete []p; //如果不加[],只销毁第一个元素
p=NULL;
system("pause");
return 0;
}
对象成员
对于描述如下图线段
要定义两个类,一个描述坐标,一个描述线段。
这里在Line里面的属性是调用Coordinate对象的。
在对Line传参时应用如下的初始化列表,实例化两个m_coor
,把line
传入的参数分配到这两个对象中去
实例化如下,在创建过程中,先创建m_coorA
,再创建m_coorB
,最后是Line
。销毁的时候顺序相反。
来看一个例子
创建两个类:Coordinate
与Line
Coordinate.h
文件:
#pragma once
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
文件:
#include <iostream>
#include "Coordinate.h"
using namespace std;
Coordinate::Coordinate(int x,int y)
{
m_ix = x;
m_iy = y;
cout << "Coordinate" <<m_ix<<"."<<m_iy<< endl;
}
Coordinate::~Coordinate()
{
cout << "~Coordinate" << m_ix << "." << m_iy << 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
文件:
#pragma once
#include "Coordinate.h"
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 printfo();
private:
Coordinate m_coorA; // 实例化Coordinate
Coordinate m_coorB;
};
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::printfo()
{
cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;
cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;
}
主程序文件:
#include <iostream>
#include<stdlib.h>
#include <string.h>
#include "Coordinate.h"
#include "Line.h"
using namespace std;
int main(void)
{
Line*p = new Line(1,2,3,4);
p->printfo();
delete p;
p = NULL;
system("pause");
return 0;
}
可以看出 ,在创建类Line
时,先调用两个Coordinate
类,最后销毁的时候顺序相反。
如果Coordinate
的构造函数里面有参数的话,Line
的构造函数在初始化的时候要用初始化列表的形式,向Coordinate
对象传参。