c++远征之封装篇(对象指针)

本文通过两个实例介绍C++中对象指针与对象成员指针的应用:一是使用对象指针计算坐标点的和;二是利用对象成员指针创建线段类,演示了如何在类中使用指针成员来指向其他对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象指针
1.对象指针
/******************************************/
要求:
        定义Coordinate类
        数据成员:m_iX和m_iY
        声明对象指针,并通过指针操控对象

        计算两个点,横、纵坐标的和
/******************************************/

/*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;
	p1 = new Coordinate;
	Coordinate *p2 = new Coordinate();
	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;
	system("pause");
	return 0;
}

运行结果:



2.对象成员指针
例子如下:画一条线段(端点坐标为A和B)
/************************************************************/
要求:
        定义两个类:
                   坐标类:Coordinate
                   数据成员:横坐标m_iX,纵坐标m_iY
                   成员函数:构造函数、析构函数、数据封装函数
                   线段类:Line
                   数据成员:点A指针 m_coorA,点B指针 m_coorB
                   成员函数:构造函数、析构函数、数据封装函数、信息打印函数
/************************************************************/

与上述对象成员的不同之处就是Line成员里用到了指针
#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;
};

#include<iostream>
#include"Line.h"
using namespace std;

Line::Line(int x1,int y1,int x2,int y2)
{
	m_pCoorA = new Coordinate(x1,y1);
	m_pCoorB = new Coordinate(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;

}

/*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 << "(32位机)指针的大小:"<<sizeof(p) << endl;
	cout << "Line的大小:"<<sizeof(Line) << endl;
	system("pause");
	return 0;
}

运行代码:


三个注意的地方:
1.与前面那个例子不同的地方,前面那个例子没有用到指针,所以是通过栈申请内存的,内存释放是系统自动完成的,而且释放过程与对象创建过程正好相反;而这个例子用到了指针,是从堆中分配内存的,内存释放需要手动完成,所以析构函数的执行顺序与你delete指针的顺序一致。
2.sizeof(p)为什么是4,因为在32位机中所有的指针都占4字节。
3.sizeof(Line)为什么是8,因为Line中包含两个点指针,每一个点指针是4,所以总大小是8字节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值