www.gusucode.com > 《C++高级语言程序设计》PPT及全书例子源代码-源码程序 > 《C++高级语言程序设计》PPT及全书例子源代码-源码程序/code/C++例题程序/第6章/s6_5/smain6_5_0.cpp

    //Download by http://www.NewXing.com
//文件名:smain6_5.cpp
//new和delete的用法。

#include <iostream>

using namespace std;

class CPoint						//CPoint类
{
public:
	CPoint(int x = 0, int y = 0);	//构造函数,缺省参数:x=0;y=0.
	int SetTemp();					//设置m_temp的值
	void Print();					//显示,一般成员函数
	void Print() const;				//显示,常成员函数

private:
	int m_x;						// x坐标
	const int  m_y;					// y坐标,常数据成员
	static const int m_z;			//z坐标,静态常数据成员
	int m_temp;						//增加的数据成员,未初始化,注意观察其值。
};

//增加一个类,定义了构造函数,但没有缺省参数或者无参数的构造函数,无法创建对象数组。
class CTemp
{
public:
	CTemp(int x)					//带参数的构造函数
	{
		m_temp = x;					
	}

private:
	int m_temp;
};

const int CPoint::m_z = 0;			//静态数据成员的初始化方式。

CPoint::CPoint(int x, int y) : m_y(y)	//构造函数,m_y采用了初始化表的方式初始化。
{
	m_x = x;//正确。对于一般数据成员可以采用赋值方式也可以采用初始化表的方式初始化。
	//m_y = y;//错。对于常数据成员必须采用初始化表的方式初始化,不能够用赋值方式。
}

int CPoint::SetTemp()					//改变m_temp
{
	m_temp++;							//正确。一般成员函数可以改变对象。
	return m_temp; 
}

void CPoint::Print()				//显示,一般成员函数
{ 
	cout << "一般成员函数调用:" << m_x << ", " << m_y <<", " << m_z <<", " << m_temp << endl; 
}

void CPoint::Print() const			//显示,常成员函数
{ 
	cout << "  常成员函数调用:" << m_x << ", " << m_y <<", " << m_z <<", " << m_temp << endl; 
}

//测试函数。
void main()
{
	const int ARRAY_SIZE = 5;
	//const CPoint *poCPoint2 = new CPoint(5, 6);
	//poCPoint2->Print();
	CPoint *poCPoint;
	poCPoint = new CPoint[ARRAY_SIZE];		//创建对象时,自动调用构造函数。
	if (poCPoint == NULL)					//判断动态内存申请是否成功。
	{
		cout << "动态内存分配失败。\n";
		return;
	}
	for (int iCnt=0; iCnt<ARRAY_SIZE; iCnt++)
	{
		poCPoint[2].SetTemp();            //每次都只修改了对象2的m_temp值。
		poCPoint[iCnt].Print();
	}
	delete []poCPoint;						//释放动态数组内存空间。
	//动态内存释放后,让poCPoint指针指向NULL。否则,它依然指向原动态空间。
	poCPoint = NULL;

	CTemp *poCTemp = new CTemp(5);
	if (poCTemp == NULL)					//判断动态内存申请是否成功。
	{
		cout << "动态内存分配失败。\n";
		return;
	}
	//CTemp poCTemp = new CTemp[ARRAY_SIZE];	//错误。CTemp没有适合动态内存的构造函数。
	delete poCTemp;

	const CPoint *poCPoint2 = new CPoint(5, 6);//得到一个指向常量的对象指针
	if (poCTemp == NULL)					//判断动态内存申请是否成功。
	{
		cout << "动态内存分配失败。\n";
		return;
	}
	//poCPoint2->SetTemp();					//错误。常对象不可以调用常成员函数。
	poCPoint2->Print();						//注意:此处调用的是常成员函数
	//delete poCPoint2;						//错误。该语句不可用,道理何在?

	//后面的对象,都不在动态内存中,不能够用delete释放,也无需用户释放。
	//系统自动释放。
	CPoint oCPoint1(1, 1),oCPoint2;	//生成一般对象,实际上是对象变量,其值可以改变。
	const CPoint ocCPoint3(3, 3);	//生成一个常对象。对象常量。其值不可改变。

	//注意后面各对象调用Print()的差别。
	oCPoint1.Print();
	oCPoint2.Print();				//一般对象调用一般成员函数
	ocCPoint3.Print();				//正确。常对象调用常成员函数。
}