C++学习——类对象作为类成员的案例、new运算符动态分配内存

类对象作为类成员

类对象作为类成员的时候 构造顺序是先将类对象一一构造,然后构造自己,析构的顺序是相反

//类对象作为类成员的案例
//类对象作为类成员的时候 构造顺序是先将类对象一一构造,然后构造自己,析构的顺序是相反
class Phone
{
public:
	Phone()
	{
		cout << "手机的默认构造函数调用" << endl;
	}
	Phone(string name)
	{
		mPhoneName = name;
		cout << "手机的构造函数" << endl;
	}
	~Phone()
	{
		cout << "手机的析构函数调用" << endl;
	}
	string mPhoneName;
};

class Game
{
public:
	Game()
	{
		cout << "游戏的默认构造函数调用" << endl;
	}
	Game(string name)
	{
		mGameName = name;
		cout << "游戏的构造函数" << endl;
	}
	~Game()
	{
		cout << "游戏的析构函数调用" << endl;
	}

	string mGameName;
};

class Person
{
public:
	Person()
	{
		cout << "Person的默认构造函数调用" << endl;
	}

	//初始化成员列表
	Person(string name, string phoneName, string gameName) : m_Name(name), m_Pone(phoneName), m_Game(gameName)
	{
		cout << "Person的构造函数" << endl;
	}

	void playGame()
	{
		cout << m_Name << "拿着" << m_Pone.mPhoneName << "玩" << m_Game.mGameName << endl;
	}

	~Person()
	{
		cout << "Person的析构函数调用" << endl;
	}
	string m_Name;  //这里如果用char *要考虑深拷贝和浅拷贝的问题 内部释放问题 用string就没事
	Phone m_Pone;
	Game m_Game;
};

void test01()
{
	//Person p;
	//p.m_Pone.mPhoneName = "华为";
	//p.m_Game.mGameName = "斗地主";
	Person p("老王", "华为", "斗地主");
	p.playGame();

}

explicit关键字的作用

加了explicit可以防止隐式类型转换

//explicit关键字作用
class MyString
{
public:
	MyString(const char * str)
	{

	}

	explicit MyString(int a)  //加了explicit可以防止隐式类型转换,即不能用MyString str3 = 10
	{
		mSize = a;
	}
	
	char * mStr;
	int mSize;
};
void test02()
{
	MyString str = "abc";  //相当于MyString str = MyString("abc"),隐式类型转换
	MyString str2(10);   //这样就比较明确是调用int类型的形参
	//MyString str3 = 10;// 做什么用途??str2字符串为"10",字符串的长度为10
}

new运算符动态分配内存

new和malloc的区别

  1. new出来的对象,都会返回该类型的指针;malloc返回void* ,还要进行强转
  2. new会调用构造函数;malloc不会调用构造函数
  3. new是运算符;malloc是函数
  4. new配合delete用, malloc配合free用

当用void* 接受new出来的指针,会出现释放的问题

可以通过new来开辟数组,用delete[] 释放;用new开辟数组一定要调用默认构造函数,所以一定要提供默认构造

//动态分配内存
//new运算符使用
class Student
{
public:
	Student()
	{
		cout << "默认构造函数" << endl;
	}

	Student(int a)
	{
		cout << "有参构造函数" << endl;
	}

	~Student()
	{
		cout << "析构函数" << endl;
	}
};
void test03()
{
	// (1)、new和malloc的区别
	//Student st;  //开辟的是栈区
	Student *st = new Student; //在堆区开辟

	//所有new出来的对象,都会返回该类型的指针
	//malloc返回void* ,还要进行强转
	//malloc会调用构造吗?  不会  new会调用构造
	//malloc是函数, new是运算符
	//释放堆区的空间是delete, delete也是运算符
	//new配合delete用, malloc配合free用
	delete st;

	// (2)、当用void* 接受new出来的指针,会出现释放的问题
	void *p = new Person;
	delete p; //这时候不会调用析构函数,无法释放


	// (3)、可以通过new来开辟数组
	// 但是需要特别注意的是,用new开辟数组一定要调用默认构造函数,所以一定要提供默认构造
	Student *nArray = new Student[10];

	//在栈上开辟数组,可以指定有参构造函数
	Student mArray[10] = { Student(1), Student(2) };

	//释放new出来的数组对象
	delete[] nArray;
	
}

 

实验题目1:班级学生学期成绩管理系统 (1)程序功能简介 灵活运用的继承、对象成员等机制,设计一个能够实现班级学生学期成绩管理的程序。 (2)程序设计说明 ① 个人信息CPerson的数据成员有姓名、性别、年龄、身份证号等数据成员成员函数根据需要自行设计; ② 学生CStudent从CPerson派生,并增加学号、CCourse对象成员数组(大小至少3个)等数据成员,并根据需要自行设计成员函数,包括能够求解所选修课程的总学分、显示某个学生基本信息和课程信息的成员函数; ③ 课程CCourse包括课程名、学分、分数、任课老师等数据成员成员函数根据需要自行设计; ④ 班级CClass的数据成员有班级名称、班级人数、CStudent对象成员数组(大小由构造函数确定)等。本班级CClass的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中用delete释放。在CClass中设计包括能够求解最高成绩、最低成绩和平均成绩以及通过学号查找并输出某个学生全部信息(例如Seek())等功能在内的成员函数; ⑤ 构造三十个学生的数据,每个学生都有三门课程成绩,输出并显示这些数据; ⑥ 根据的需要添加适当的其它成员,编写完整的程序并测试。 (3)程序调试运行 运行程序查看结果,并进行源代码调试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值