C++自学笔记(10)之对象成员与数组

对象数组

在这里插入图片描述
上图为在栈中及堆中实例化数组的例子

在这里插入图片描述
实现如上图的代码,具体如下
先在当前project下创建一个类
在这里插入图片描述
输入类名Coordinate,会自动生成的Coordinate.hCoordinate.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。销毁的时候顺序相反。
在这里插入图片描述
来看一个例子
在这里插入图片描述
创建两个类:CoordinateLine
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;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/2019
可以看出 ,在创建类Line时,先调用两个Coordinate类,最后销毁的时候顺序相反。
如果Coordinate的构造函数里面有参数的话,Line的构造函数在初始化的时候要用初始化列表的形式,向Coordinate对象传参。

猜你喜欢

转载自blog.csdn.net/qq_39672732/article/details/88819309
今日推荐