在上一篇文章中已经介绍了C++对象指针的概念,本篇文章主要讲解对象指针的两种创建方式
C++对象指针简介:C++对象指针
先来看一个示例:
Test1.h
#ifndef TEST1_H
#define TEST1_H
class Student{
public:
Student(){}
int getNum();
int getScore();
void print()const;
int num;
int score;
};
#endif
Test1.cpp
#include
#include
using namespace std;
#include"Test1.h"
int Student::getNum(){
return num;
}
int Student::getScore(){
return score;
}
void Student::print() const
{
cout<<"学号:"<num=2;
ptrstu->score=100;
ptrstu->print();
return 0;
}
分析:
首先在h文件中定义了Student类以及声明了类的成员函数,在cpp中定义成员函数。
1.在main函数中创建了Student类的对象std1
2.定义对象指针ptrstu //Student* ptrstu=&std1;
3.对象指针指向类的对象的地址 //Student* ptrstu=&std1;
4.访问类的对象中的成员变量
这是第一种方式,通过定义对象指针指向类的实例化对象的地址
将上面的例子修改main函数中的内容即可实现
int main(){
Student* ptrstu=new Student;
ptrstu->num=3;
ptrstu->score=99;
ptrstu->print();
delete ptrstu;
return 0;
}
结果:
分析:
此方法直接定义类的实例化的指针对象,且这个实例化的指针对象可以访问类的所有数据成员。
1.第一种创建指针对象是在栈上面分配内存,通过“&”可以获取地址,对象使用完后会自动回收。
2.第二种创建对象指针是在堆上面创建并分配内存空间的,用完不会自动回收,需要手动使用delete关键字回收。
3.在栈上创建出来的对象都有一个名字,比如std1,使用指针并不一定要指向它。
4.在堆上分配内存,使用new创建出来的对象,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象,即,使用new在堆上创建的对象是匿名的,没法直接使用,必须要有一个指针指向它,再借助指针来访问它的成员函数或成员变量。
5.栈内存是程序自动管理,不能使用delete删除在栈上创建的对象,堆内存由程序员管理,对象使用完毕后可以通过delete删除,实际开发中,new和delete是成对出现的,保证及时删除不再使用的对象,防止无用内存堆积,我们一般可以在析构函数中使用delete删除对象指针。
通过以上的讲解,大家都能够理解了对象指针的作用,那么,现在实例演示开发中常见的方法–在一个类中,通过对象指针访问另一个类的成员变量
示例:
Test1.h
#ifndef TEST1_H
#define TEST1_H
#include "Test2.h"
class Student{
public:
Student(){}
Teacher* t;
void getTeacher();
~Student();
};
#endif
Test2.h
#ifndef TEST2_H
#define TEST2_H
class Teacher{
public:
Teacher(){}
int getStudentNum( int count);
~Teacher();
};
#endif
Test2.cpp
#include
#include
using namespace std;
#include"Test2.h"
int Teacher::getStudentNum(int number){
return number;
}
Teacher::~Teacher()
{
}
Test1.cpp
#include
#include
using namespace std;
//#include"Test2.h"
#include"Test1.h"
Student::~Student(){
delete t;
}
void Student::getTeacher(){
t=new Teacher;
t->getStudentNum(50);
cout<getStudentNum(50)<getTeacher();
delete pstr;
return 0;
}
要求:在Student类中通过getTeacher()方法访问Teacher类中的getStudentNum()方法。
首先一步步讲解:
1.在Test1.h中定义Student类,声明类中的方法以及变量的定义。//这里类中的方法为getTeacher()为了获取Teacher类中的方法所定义的函数,Teacher* t;为在Student类中声明Teacher类的指针。
2.在Test2.h中定义Teacher类,声明类中的方法为getStudentNum()。
3.在Test2.cpp中定义getStudentNum()方法为返回学生数量。
4.在Test1.cpp中定义getTeacher()方法,其中创建了Teacher类的对象指针t,通过new创建,t=new Teacher;
5.通过此对象指针可以获取Teacher类中的方法getStudentNum()。
6.在Test1.cpp中定义Student类的析构函数~Student(),为了在对象使用完后删除Teacher类的对象指针
7.创建Student的对象指针pstr,可以使用以上两种方法,如果使用new创建,最后要使用delete删除对象指针。
综上:此实例实现了在Student类中使用Teacher类的对象指针,访问Teacher类的成员函数。