• C++语言基础(4)-构造函数和析构函数


    一.构造函数

    类似于java,C++中也有构造函数的概念,相关用法如下:

    1.1 构造函数的定义

    #include <iostream>
    using namespace std;
    
    class Student{
    private:
        char *m_name;
        int m_age;
        float m_score;
    public:
        //声明构造函数
        Student(char *name, int age, float score);
        //声明普通成员函数
        void show();
    };
    
    //定义构造函数
    Student::Student(char *name, int age, float score){
        m_name = name;
        m_age = age;
        m_score = score;
    }
    //定义普通成员函数
    void Student::show(){
        cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
    }
    
    int main(){
        //创建对象时向构造函数传参
        Student stu("小明", 15, 92.5f);
        stu.show();
        //创建对象时向构造函数传参
        Student *pstu = new Student("李华", 16, 96);
        pstu -> show();
    
        return 0;
    }

    运行结果:

    小明的年龄是15,成绩是92.5
    李华的年龄是16,成绩是96

    1.2 构造函数的重载

    构造函数同样也支持重载操作:

    #include <iostream>
    using namespace std;
    
    class Student{
    private:
        char *m_name;
        int m_age;
        float m_score;
    public:
        Student();
        Student(char *name, int age, float score);
        void setname(char *name);
        void setage(int age);
        void setscore(float score);
        void show();
    };
    
    Student::Student(){
        m_name = NULL;
        m_age = 0;
        m_score = 0.0;
    }
    Student::Student(char *name, int age, float score){
        m_name = name;
        m_age = age;
        m_score = score;
    }
    void Student::setname(char *name){
        m_name = name;
    }
    void Student::setage(int age){
        m_age = age;
    }
    void Student::setscore(float score){
        m_score = score;
    }
    void Student::show(){
        if(m_name == NULL || m_age <= 0){
            cout<<"成员变量还未初始化"<<endl;
        }else{
            cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
        }
    }
    
    int main(){
        //调用构造函数 Student(char *, int, float)
        Student stu("小明", 15, 92.5f);
        stu.show();
    
        //调用构造函数 Student()
        Student *pstu = new Student();
        pstu -> show();
        pstu -> setname("李华");
        pstu -> setage(16);
        pstu -> setscore(96);
        pstu -> show();
    
        return 0;
    }

    运行结果:

    小明的年龄是15,成绩是92.5
    成员变量还未初始化
    李华的年龄是16,成绩是96

    1.3 默认构造函数

    类似于java,如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的。

    注意:调用没有参数的构造函数也可以省略括号。

    Student *stu  = new Student;

    Student *stu = new Student();

    以上两种写法是等价的。

    1.4 构造函数的参数初始化表

    构造函数的主要目的是用于对成员变量进行初始化, 为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。具体写法如下:

    #include <iostream>
    using namespace std;
    
    class Student{
    private:
        char *m_name;
        int m_age;
        float m_score;
    public:
        Student(char *name, int age, float score);
        void show();
    };
    
    //采用参数初始化表
    Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
        //TODO:
    }
    void Student::show(){
        cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
    }
    
    int main(){
        Student stu("小明", 15, 92.5f);
        stu.show();
        Student *pstu = new Student("李华", 16, 96);
        pstu -> show();
    
        return 0;
    }

    运行结果:

    小明的年龄是15,成绩是92.5
    李华的年龄是16,成绩是96

    1.5 使用参数初始化表来初始化const成员变量

    参数初始化表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用参数初始化表。例:

    class VLA {
    private:
        const int m_len;
        int *m_arr;
    public:
        VLA(int len);
    
    };
    
    
    
    VLA::VLA(int len):m_len(len) {
        m_arr = new int[len];
    }

    二.析构函数

    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数

    析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~符号。

    注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。

    class VLA {
    public:
        VLA(int len);
        ~VLA(); // 析构函数
    private:
        const int m_len;
        int *m_arr;
    };
    
    VLA::VLA(int len):m_len(len) { // 构造函数初始化
        if (len > 0) {m_arrz = new int[len];};
        else {m_arr = NULL;};
    }
    
    VLA::~VLA() {
        delete []m_arr; // 在析构函数中释放堆区申请的内存
    }

    C++ 中的 new 和 delete 分别用来分配和释放内存,它们与C语言中 malloc()、free() 最大的一个不同之处在于:用 new 分配内存时会调用构造函数,用 delete 释放内存时会调用析构函数。构造函数和析构函数对于类来说是不可或缺的,所以在C++中我们非常鼓励使用 new 和 delete。

  • 相关阅读:
    spring通过注解依赖注入和获取xml配置混合的方式
    Spring 3.0就这么简单读书笔记
    spring源码测试
    spring文档翻译
    敏感词过滤算法
    mongodb的地理空间索引如何在solr中体现
    mongodb的地理空间索引常见的问题
    mysql的distinct理解
    zookeeper管理solr的配置文件
    驾校理论考试
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/7054881.html
Copyright © 2020-2023  润新知