C++笔记(三)——对象的指针、动态建立与释放、赋值与复制

🍎1. 对象指针

🍇1.1 指向对象的指针

  1. 对象空间的起始地址就是对象的指针,定义指向对象的指针的一般形式为:类名 *对象指针名;

    Time * pt;	// 定义pt为指向Time类对象的指针变量
    Time t1;	// 定义t1为Time类对象
    pt = &t1;	// 将t1的起始地址赋给pt
    
  2. 可以通过对象指针访问对象和对象的成员

    (*pt).a;	// 即t1.a	
    pt->a;		// 即t1.a
    

🍇1.2 指向对象成员的指针

​ 存放对象成员地址的指针变量就是指向对象成员的指针变量

  1. 指向对象数据成员的指针,定义指向对象数据成员的指针的一般形式为:数据类型名 *对象指针名;

    int * p;
    p = &t1.a;	// 将对象t1的数据成员a的地址赋值给p,p指向t1.a
    cout << *p << endl;
    
  2. 指向对象成员函数的指针,定义指向公用成员函数的指针变量的一般形式为:数据类型名 (类名:: *指针变量名)(参数列表),使指针变量指向一个公用成员函数的一般形式为:指针变量名 = &类名::成员函数

    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指针

  1. 在每个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

  2. 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;

  1. 对象的赋值只对其中的数据成员赋值,而不对成员函数赋值
  2. 类的数据成员中不能包括动态分配的数据,分则在赋值时可能会出现严重后果

🍇3.2 对象的复制

对象的复制就是用一个已有的对象快速复制出多个完全相同的对象,一般形式为:类名 对象 2(对象 1)

复制过程中建立一个新的对象调用的是——复制构造函数

Box::Box(const Box &b)
{
	height = b.height;
	width = b.width;
	length = b.length;
}

另一种形式为:类名 对象名 1 = 对象名 2;

🍎4. 习题

  1. 建立一个对象数组,内放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修饰符
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ltd Pikashu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值