在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