文章目录
🍎1. 对象指针
🍇1.1 指向对象的指针
-
对象空间的起始地址就是对象的指针,定义指向对象的指针的一般形式为:类名 *对象指针名;
Time * pt; // 定义pt为指向Time类对象的指针变量 Time t1; // 定义t1为Time类对象 pt = &t1; // 将t1的起始地址赋给pt
-
可以通过对象指针访问对象和对象的成员
(*pt).a; // 即t1.a pt->a; // 即t1.a
🍇1.2 指向对象成员的指针
存放对象成员地址的指针变量就是指向对象成员的指针变量
-
指向对象数据成员的指针,定义指向对象数据成员的指针的一般形式为:数据类型名 *对象指针名;
int * p; p = &t1.a; // 将对象t1的数据成员a的地址赋值给p,p指向t1.a cout << *p << endl;
-
指向对象成员函数的指针,定义指向公用成员函数的指针变量的一般形式为:数据类型名 (类名:: *指针变量名)(参数列表),使指针变量指向一个公用成员函数的一般形式为:指针变量名 = &类名::成员函数
Time t1(1,2,3); // 定义Time类对象t1 int * p1 = &t1.a; // 定义指向整型数据的指针变量p1,p1指向t1.a cout << *p1 << endl; Time * p2 = &t1; // 定义指向Time类对象的指针变量p2,p2指向t1 p2->get_time(); void (Time:: * p3)(); // 定义指向Time类公用函数的指针变量p3 p3 = &Time::get_time(); //使p3指向Time类公用成员函数get_time() (t1.*p3)(); // 调用对象t1中p3所指的成员函数(即t1.get_time())
🍇1.3 this指针
-
在每个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
-
this指针是隐式使用的,作为参数被传递给成员函数
// 程序中定义的成员函数 int Box::volume() { return (x*y*z); } // C++编译器处理为 int Box::volume(Box * this) { return (this->x * this->y * this->z); } // 在调用成员函数a.volume时,实际上时用以下方式调用 a.volume(&a); // 将对象a的地址传递给形参this,然后按this指向去引用各成员
🍎2. 对象的动态建立和释放
前面定义的对象都是静态的,再程序运行的过程中,对象所占的空间是不能随时释放的
有时希望在需要时才建立对象,不需要时就释放它,这就是动态建立对象,使用new运算符
用new运算符动态的分配内存后,将返回一个指向新对象的指针值(即所分配内存空间的起始地址),可以通过这个地址来访问这个对象
Box * pt; // 定义一个指向Box类对象的指针变量
pt = new Box; // 在pt存放了新建对象的起始地址
Box * ps = new Box(1,2,3); // 可以在指向new时,对新建的对象进行初始化
在程序中就可以通过pt访问这个新建对象
cout << pt->height; // 输出该对象的height成员
cout << pt->volume(); // 调用该对象的volume函数
在不需要使用这个由new创建的对象时,可以使用delete运算符释放内存空间
delete pt;
🍎3. 对象的赋值和复制
🍇3.1 对象的赋值
如果对一个类定义了两个或多个对象,那么这些同类的对象之间是可以互相赋值的。
对象名1 = 对象名 2;
- 对象的赋值只对其中的数据成员赋值,而不对成员函数赋值
- 类的数据成员中不能包括动态分配的数据,分则在赋值时可能会出现严重后果
🍇3.2 对象的复制
对象的复制就是用一个已有的对象快速复制出多个完全相同的对象,一般形式为:类名 对象 2(对象 1)
复制过程中建立一个新的对象调用的是——复制构造函数
Box::Box(const Box &b)
{
height = b.height;
width = b.width;
length = b.length;
}
另一种形式为:类名 对象名 1 = 对象名 2;
🍎4. 习题
- 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号
#include <iostream>
using namespace std;
class Student
{
public:
Student(int x,int y):num(x),score(y){}
Student()
{
num = 0;
score = 0;
}
int getnum();
int getscore();
private:
int num;
int score;
};
int Student::getnum()
{
return num;
}
int Student::getscore()
{
return score;
}
void max(Student * pt)
{
int max = 0;
Student stu, * p = pt;
while(p->getnum() > 0)
{
if(max < (p->getscore()))
{
max = p->getscore();
stu = *p;
}
p++;
}
cout << "Highest scorer's id : " << stu.getnum() << endl;
}
int main()
{
Student s[5] = {Student(10, 80), Student(11, 86), Student(15, 92), Student(9, 98), Student(25, 67)};
max(s);
return 0;
}
下一章:Const修饰符