栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
    • 1. 对象指针
      • 1.1 指向对象的指针
      • 1.2 指向对象成员的指针
      • 1.3 this指针
    • 2. 对象的动态建立和释放
    • 3. 对象的赋值和复制
      • 3.1 对象的赋值
      • 3.2 对象的复制
    • 4. 习题

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 
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修饰符

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429861.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号