现在的位置: 首页 > 综合 > 正文

C++对象数组的创建

2013年10月22日 ⁄ 综合 ⁄ 共 2508字 ⁄ 字号 评论关闭

使用一维指针创建对象数组:

//============================================================================
// Name        : main.cpp
// Author      : ShiGuang
// Version     :
// Copyright   : sg131971@qq.com
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <string>
using namespace std;

int nextStudentID = 1;
class StudentID
{
public:
	StudentID()
	{
		cout << "StudentID()" << endl;
		value = nextStudentID++;
		cout << "value:" << value << endl;
	}
	~StudentID()
	{
		--nextStudentID;
		cout << "~StudentID()" << endl;
	}
protected:
	int value;
};

class Student
{
public:
	Student(string pName = "noName")
	{
		cout << "Student()" << endl;
		name = pName;
		cout << "name:" << name << endl;
	}
	~Student()
	{
		cout << "~Student()" << endl;
	}
protected:
	string name;
	StudentID id;
};

int main(int argc, char **argv)
{
	int i;
	cin >> i;
	Student *p = new Student [i];
	delete[] p;
	cout << "nextStudentID:" << nextStudentID << endl;
	return 0;
}

结果:

>>3
StudentID()
value:1
Student()
name:noName
StudentID()
value:2
Student()
name:noName
StudentID()
value:3
Student()
name:noName
~Student()
~StudentID()
~Student()
~StudentID()
~Student()
~StudentID()
nextStudentID:1

使用二维指针创建动态数组:

//============================================================================
// Name        : main.cpp
// Author      : ShiGuang
// Version     :
// Copyright   : sg131971@qq.com
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <string>
using namespace std;

int nextStudentID = 1;
class StudentID
{
public:
	StudentID()
	{
		cout << "StudentID()" << endl;
		value = nextStudentID++;
		cout << "value:" << value << endl;
	}
	~StudentID()
	{
		--nextStudentID;
		cout << "~StudentID()" << endl;
	}
protected:
	int value;
};

class Student
{
public:
	Student(string pName = "noName")
	{
		cout << "Student()" << endl;
		name = pName;
		cout << "name:" << name << endl;
	}
	~Student()
	{
		cout << "~Student()" << endl;
	}
protected:
	string name;
	StudentID id;
};

int main(int argc, char **argv)
{
	int i, j;
	string temp;
	cin >> i;
	Student **p = new Student *[i];
	for (j = 0; j < i; j++)
	{
		cout << "j:" << j << endl;
		cin >> temp;
		p[j] = new Student(temp);
		cout << "nextStudentID:" << nextStudentID << endl;
	}
	for (j = i - 1; j >= 0; j--)
		delete p[j];
//	delete[] p; // 这句话好像没作用
	cout << "nextStudentID:" << nextStudentID << endl;
	return 0;
}

结果:

>>3
j:0
>>shiguang1
StudentID()
value:1
Student()
name:shiguang1
nextStudentID:2
j:1
>>shiguang2
StudentID()
value:2
Student()
name:shiguang2
nextStudentID:3
j:2
>>shiguang3
StudentID()
value:3
Student()
name:shiguang3
nextStudentID:4
~Student()
~StudentID()
~Student()
~StudentID()
~Student()
~StudentID()
nextStudentID:1

两者的区别:

一维指针在建立指针的时候,申请并创建了三个对象。

二维指针在建立指针的时候,只创建了一个指针数组(即3*4Byte),数组里面的元素用来存放三个对象的地址,各个对象地址在后面由new创建获得。所以对应的delete函数应该是delete p[j];而不是delete[] p。


抱歉!评论已关闭.