zoukankan      html  css  js  c++  java
  • 类和对象(3)—— 对象的构造和析构

    1、如果没有析构?

    如果不用构造函数初始化,该怎么办:
      为每个类都提供一个public的initialize函数;
      对象创建后立即调用initialize函数进行初始化。

    缺点
    1)initialize只是一个普通的函数,必须显示的调用
    2)一旦由于失误的原因,对象没有初始化,那么结果将是不确定
    没有初始化的对象,其内部成员变量的值是不定的。

    所以C++对类提供了一个给对象的初始化方案,就是构造函数

    2、构造函数

    定义

      C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数.

    class 类名 
    {
        类名形式参数)
        {
            构造体
        }
    };

    比如:

    class A 
    {
        A形参)
        {
        }
    };

    调用

      自动调用:一般情况下C++编译器会自动调用构造函数.
      手动调用:在一些情况下则需要手工调用构造函数.

    规则:
    1 在对象创建时自动调用,完成初始化相关工作。
    2 无返回值,与类名同,默认无参,可以重载,可默认参数。
    3 一经实现,默认不复存在。

    3、析构函数

    定义

      C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数.

    class 类名 
    {
        ~类名()
        {
            析构体
        }
    };

    比如:

    class A 
    {
        ~A()
        {}
    };
    规则:
    1 对象销毁时,自动调用。完成销毁的善后工作。
    2 无返值 ,与类名同。无参。不可以重载与默认参数

    析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。

    代码示例:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    
    using namespace std;
    
    class Test
    {
    public:
        //Test类的构造函数
        //在对象被创建的时候,用来初始化对象的函数
        Test(int a, int b)
        {
            m_x = a;
            m_y = b;
        }
        Test(int a)
        {
            m_x = a;
            m_y = 0;
        }
        //无参数的构造函数
        Test()
        {
            m_x = 0;
            m_y = 1;
        }
        void printT()
        {
            cout << "x=" << m_x << ",y=" << m_y << endl;
        }
        //析构函数和构造函数都没有返回值,
        //析构函数没有形参
        ~Test()
        {
            cout <<" ~Test()..." << endl;
        }
    private:
        int m_x;
        int m_y;
    
    };
    
    void test()
    {
        Test t1(10, 20);
        t1.printT();
        //在一个对象临死之前,要自动调用析构函数
        //即:在test执行完毕之后,会在"}"触发析构函数
    }
    
    int main(void)
    {
        Test t1(10, 20);
        t1.printT();
    
        Test t2(100);
        t2.printT();
    
        Test t3;//就是调用类的无参数构造函数
        t3.printT();
    
        test();
        return 0;
    }
  • 相关阅读:
    spring boot 2 统一异常处理
    spring boot 2.0.4 Redis缓存配置
    windows下consul利用json文件注册服务
    docker安装portainer
    Docker 清理命令
    git command line 提交代码
    java应用健康检查
    springboot @Value获取值为空,解决办法
    解决You have new mail in /var/spool/mail/root提示
    kafka之kafka的伪分布式安装
  • 原文地址:https://www.cnblogs.com/yuehouse/p/9791299.html
Copyright © 2011-2022 走看看