C++第二节(2):复合类、析构函数、new、delete

复合类、析构函数、指针复合、new、delete

1、复合类:

     1.1 复合类的成员变量,是另一个类的对象

2、析构函数:

     2.1 收回构造函数时申请的资源,垃圾回收

     2.2 调用析构函数的两种情况:离开对象的作用域、销毁对象删除一个指向对象的指针

     2.3 特点:无返回值,无参,唯一,公有

     2.4 当一个类中有指针成员变量,而且指针指向的空间是手动开辟的堆空间时,必须写析构函数

D、复合类

Work.h

#ifndef __C__No727Class__Work__
#define __C__No727Class__Work__

#include <iostream>
using namespace std;
class Work    //最先编写的头文件
{
private:
    int number;    //作业数量
public:
    Work(int n);   //自定义构造函数
    ~Work();       //析构函数
    void print();  //输出信息
};
#endif /* defined(__C__No727Class__Work__) */
Work.cpp

#include "Work.h"  //成员函数的实现
Work::Work(int n)
{
    number = n;
}
Work::~Work()
{
    cout << "析构Work" << endl;
}
void Work::print()
{
    cout << "number is :" << number << endl;
}
Student.h

#include <iostream>
#include "Work.h"    //包含
class Student
{
private:
    char *name;
    int num;
    Work w;    //类类型的私有成员变量w,表示作业
public:
    Student(char *a, int b, int c);
    ~Student();
    void print();
};
#endif /* defined(__C__No727Class__Student__) */
Student.cpp

#include "Student.h"
Student::Student(char *a, int b, int c):w(c)  //:成员变量(赋给成员变量的值),初始化列表
{
    name = a;
    num = b;
}
Student::~Student()
{
    cout << "析构Student" << endl;
}
void Student::print()
{
    w.print();
    cout << "name  is  :" << name << endl;
    cout << "num   is  :" << num << endl;
}
main.cpp

#include "Student.h"
int main()
{
    Student s("名字", 123401, 10);
    s.print();
    return 0;  //首先析构Student,过程中因需要析构Work才可以完成析构Student,所以调用析构Work的函数
}
E、指针复合

Toy.h

#ifndef __C__No727Class__Toy__
#define __C__No727Class__Toy__

#include <iostream>
using namespace std;
class Toy
{
private:
    int number;
    
public:
    Toy(int n);
    ~Toy();
    void print();
};
#endif /* defined(__C__No727Class__Toy__) */
Toy.cpp

#include "Toy.h"
Toy::Toy(int n)
{
    number = n;
}
Toy::~Toy()
{
    cout << "析构Toy" << endl;
}
void Toy::print()
{
    cout << "number is " << number << endl;
}
Baby.h

#ifndef __C__No727Class__Baby__
#define __C__No727Class__Baby__

#include <iostream>
#include "Toy.h"
using namespace std;
class Baby
{
public:
    Baby(char * n, int a, int number);
    ~Baby();
    void print();
private:
    char * name;
    int age;
    Toy *t;    //类类型的指针
};
#endif /* defined(__C__No727Class__Baby__) */
Baby.cpp

#include "Baby.h"
Baby::Baby(char * n, int a, int number)
{
    name = n;
    age = a;
    t = new Toy(number);  //手动分配内存,指针指向new出来的堆空间,堆空间里面是一个Toy类的对象
}
Baby::~Baby()
{
    cout << "析构Baby" << endl;
    if(t)    //如果指针所指向的空间有内容
    {
        delete t;   //手动回收内存,把new出来的空间收回
        t = NULL;   //指针置空
    }
}
void Baby::print()
{
    (*t).print();  //t -> print();
    cout << " name is " << name  << endl;
    cout << " age  is " << age << endl;
}
main.cpp

#include "Baby.h"
int main()
{
    Baby a("a", 1, 10);
    a.print();
    return 0;  //首先析构Boy,并没有直接使用Toy的对象,所以不会自动调用析构Toy的函数,需要手动回收,delete时调用析构Toy的函数
}
F、两个成员变量

Paper.h

#ifndef __C__No727Class__Paper__
#define __C__No727Class__Paper__

#include <iostream>
using namespace std;
class Paper
{
public:
    Paper(int n, char *s);
    ~Paper();
    void show();
private:
    int number;    //两个成员变量
    char * subject;
};
#endif /* defined(__C__No727Class__Paper__) */
Paper.cpp

#include "Paper.h"
Paper::Paper(int n, char *s)
{
    number = n;
    subject = s;
}
Paper::~Paper()
{
    cout << "析构Paper" << endl;
}
void Paper::show()
{
    cout << "数量 is : " << number << endl;
    cout << "科目 is : "<< subject << endl;
}
Teacher.h

#ifndef __C__No727Class__Teacher__
#define __C__No727Class__Teacher__

#include <iostream>
#include "Paper.h"
class Teacher
{
private:
    int num;
    char * name;
    Paper p;
public:
    Teacher(int a, char * b, int n, char * s);
    ~Teacher();
    void show();
};
#endif /* defined(__C__No727Class__Teacher__) */
Teacher.cpp

#include "Teacher.h"
Teacher::Teacher(int a, char * b, int n, char * s):p(n, s)
{
    num = a;
    name = b;
}
Teacher::~Teacher()
{
    cout << "析构Teacher" << endl;
}
void Teacher::show()
{
    p.show();
    cout << "编号 is : " << num << endl;
    cout << "姓名 is : " << name << endl;
}
main.cpp

#include "Teacher.h"
int main()
{
    Teacher t(1234, "名字", 50, "计算机");
    t.show();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值