C++中的指针、引用、指针引用

在C++指针的用处很大,可以快读的访问地址空间,而且本身不占太大内存。指针操作在参数传递的时候非常方便。既可以作为传入参数,又可以作为返回值。但是可不可作为函数的传出参数呢?下面通过一个例子来说明。
教室里面包含多个老师,每个老师管理多个学生

学生类

#pragma once
#include <string>
class Student {
public:
	Student();
	Student(int id,std::string name);
	~Student();

	int&getID() {
		return _id;
	}
	std::string&getName() {
		return _name;
	}

private:
	int _id = 0;//学生编号
	std::string _name;//学生姓名
};
#include "Student.h"
Student::Student() {
}
Student::Student(int id, std::string name) {
	_id = id;
	_name = name;
}
Student::~Student() {
}

教师类

#pragma once
#include <vector>
#include <string>
class Student;
class Teacher {
public:
	Teacher();
	Teacher(std::string name);
	~Teacher();

	std::string&getName() {
		return _name;
	}

	void addStudent(Student* stu);

	std::vector<Student*>&getStudentList() {
		return _studentList;
	}
private:
	std::string _name;//老师姓名

	std::vector<Student*> _studentList;//学习列表
};
#include "Teacher.h"
Teacher::Teacher() {
}

Teacher::Teacher(std::string name) {
	_name = name;
}

Teacher::~Teacher() {
}

void Teacher::addStudent(Student* stu) {
	_studentList.emplace_back(stu);
}

教室类:

#pragma once
#include <vector>

//教室

class Teacher;
class Student;

class ClassRoom {
public:
	ClassRoom();
	~ClassRoom();

	void addTeacher(Teacher* teacher);

	//根据学生ID获取学对象,并且找到相应的老师
	Student* getStudenByID(int id, Teacher* teacher);
	Student* getStudenByID_v2(int id, Teacher*&teacher);
	Student* getStudenByID_v3(int id, Teacher&teacher);
private:
	std::vector<Teacher*> _teacherList;
};
#include "ClassRoom.h"
#include "Teacher.h"
#include "Student.h"

ClassRoom::ClassRoom() {
}


ClassRoom::~ClassRoom() {
}

void ClassRoom::addTeacher(Teacher* teacher) {
	_teacherList.emplace_back(teacher);
}

Student* ClassRoom::getStudenByID(int id, Teacher* teacher) {
	int teacherCount = _teacherList.size();
	for (int i = 0; i < teacherCount;i++) {
		Teacher* oneTeacher = _teacherList.at(i);
		std::vector<Student*>&studentList = oneTeacher->getStudentList();
		int studentCount = studentList.size();
		for (int k =0;k< studentCount;k++){
			Student*student = studentList.at(k);
			if (student->getID() == id){
				teacher = oneTeacher;
				return student;
			}
		}
	}
	return nullptr;
}

Student* ClassRoom::getStudenByID_v2(int id, Teacher*&teacher) {
	int teacherCount = _teacherList.size();
	for (int i = 0; i < teacherCount; i++) {
		Teacher* oneTeacher = _teacherList.at(i);
		std::vector<Student*>&studentList = oneTeacher->getStudentList();
		int studentCount = studentList.size();
		for (int k = 0; k < studentCount; k++) {
			Student*student = studentList.at(k);
			if (student->getID() == id) {
				teacher = oneTeacher;
				return student;
			}
		}
	}
	return nullptr;
}

Student* ClassRoom::getStudenByID_v3(int id, Teacher&teacher) {
	int teacherCount = _teacherList.size();
	for (int i = 0; i < teacherCount; i++) {
		Teacher* oneTeacher = _teacherList.at(i);
		std::vector<Student*>&studentList = oneTeacher->getStudentList();
		int studentCount = studentList.size();
		for (int k = 0; k < studentCount; k++) {
			Student*student = studentList.at(k);
			if (student->getID() == id) {
				teacher = *oneTeacher;
				return student;
			}
		}
	}
	return nullptr;
}

客户端:

	ClassRoom* room = new ClassRoom;
	Teacher* zhangTeacher = new Teacher("张老师");
	Teacher* liTeacher = new Teacher("李老师");
	room->addTeacher(zhangTeacher);
	room->addTeacher(liTeacher);

	Student* aStudent = new Student(1, "A");
	Student* bStudent = new Student(2, "B");
	Student* cStudent = new Student(3, "C");
	Student* dStudent = new Student(4, "D");
	Student* eStudent = new Student(5, "E");

	zhangTeacher->addStudent(aStudent);
	zhangTeacher->addStudent(bStudent);

	liTeacher->addStudent(cStudent);
	liTeacher->addStudent(dStudent);
	liTeacher->addStudent(eStudent);

	Teacher* teacherX = nullptr;
	Student*studentX = room->getStudenByID(3, teacherX);

	Teacher* teacherY = nullptr;
	Student*studentY = room->getStudenByID_v2(3, teacherY);

	Teacher teacherZ;
	Student*studentZ = room->getStudenByID_v3(3, teacherZ);

运行一下,查看变量:
在这里插入图片描述

teacherX 为空 teacherY 和teacherZ分别获得了正确的值。因为第一个函数传入的是Teacher的指针,也就是相当于一个临时变量,函数调用的时候,就是重新复制一份临时指针变量,和函数外面的指针变量没有任何关系,所以就是失败。

可以采用传递引用或者指针引用的方式,就是通过函数参数来获取函数的返回值。

aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值