【无标题】

任务描述

本关任务:设计一个带有构造函数和析构函数的学生类。

相关知识

构造函数、析构函数与赋值函数是每个类最基本的函数。他们太普通以致让人容易麻痹大意,其实这些貌似简单的函数在使用时要特别注意以免造成不必要资源浪费和产生意想不到的错误。

每个类只有一个析构函数和一个赋值函数,但是可以有多个构造函数(包含一个拷贝构造函数,其他的成为普通构造函数)。

下面我们就一起来学习构造函数和析构函数的基本使用。

构造函数

所谓构造函数,就是在对象构造的时候调用的函数。构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。

构造函数在定义类对象时自动调用,不需用户调用,也不能被用户调用。在对象使用前调用。如果类中没有定义构造函数,系统则会自动给出一个无参构造函数。

构造函数没有返回值,函数名必须与类名一致,一个类可以有多个构造函数,但是参数必须有差别(也就是所谓的重载)。

例如:

class Test
{
    public:
        Test();     // 无参数的构造函数
        Test(int a);     // 有一个 int 参数的构造函数
    private:
        Test(int a,int b);     // 私有的两个参数的构造函数
};
Test::Test()
{ /* 此处省略一些初始化的工作 */}
Test::Test(int a)
{ /* …… */}
Test::Test(int a,int b)
{ /* …… */}

构造函数也会受访问性影响,在不同的作用范围,能调用的构造函数也会不同。

初始化成员

构造函数的一个重要任务就是给成员初始化,初始化成员有两种办法,一种是手动给成员赋值,另一种是使用初始化列表。这里介绍第二种,格式为:

 
类名::构造函数名(参数表): (成员初始化表){ 构造函数体 }

构造函数中的初始化列表只需要在参数列表的后面加一个冒号:),然后将要初始化的成员按照成员名(参数)的格式排列在后面,个成员之间用逗号隔开。

例如:

class Test
{
public:
    int A;
    int B;
    Test(int a);
};
Test::Test(int a)
    :A(a),B(10)     //给成员变量 A、B 初始化,不一定要和参数列表写在一行
{ /* …… */ }

其中成员的初始化顺序不是按照初始化列表中的顺序来的,而是按照成员声明的顺序来的,例如:

 
  1. /* Test类的声明同上 */
    Test::Test(int a)
        :B(10),A(a)     // 虽然 B 在前面,但还是 A 先初始化
    {/* …… */}
    Test::Test(int a)
        :B(a),A(B)     //此处 A 的初始化依赖了 B,然而是 A 先初始化,这就导致 A 得到了 B 中还没初始化的错误内容
    {/* …… */}
析构函数

析构函数是一种特殊的成员函数,它会在每次删除所创建的对象时执行。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。格式如下:

 
类名::~析构函数名(){}

例如:

class Test
{
    public:
        ~Test();     // 析构函数
};
Test::~Test()
{/* 一些收尾的工作 */}
编程要求

在右侧编辑器中的Begin-End之间补充代码,编写一个学生类 Student,类中含有两个成员变量、两个构造函数和一个析构函数(访问性都为公有的),平台会调用你编写的函数来创建学生对象,具体要求如下:

  • 学号:int SID

  • 姓名:string Name

  • 无参的构造函数:Student(),在函数中将学号初始化为0,姓名初始化为王小明。

  • 带两个参数的构造函数:Student(int sid,string name);,在函数中分别用这两个参数设置内部的两个成员。

  • 析构函数:~Student(),在函数中输出学号 姓名 退出程序的消息。

自编答案:

#include<iostream>
#include<string>
using namespace std;

class Student
{
/********* Begin *********/
    int SID;
    string Name;
    public:
        Student();
        Student(int sid,string name);
        ~Student();
//在此处声明所需的成员

/********* End *********/
};

/********* Begin *********/
Student::Student()
{
    SID=0;
    Name="王小明";
}
//在此处定义成员函数
Student::Student(int sid,string name)
{
    SID=sid;Name=name;
}
/********* End *********/
Student::~Student()
{
    cout<<SID<<" "<< Name<<" 退出程序"<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值