zoukankan      html  css  js  c++  java
  • VC++ 之 第八课(面向对象三)

      这节讲解构造函数和析构函数

      构造函数

      构造函数是一个与类名相同的方法,它可以没有参数,也可以有一个或多个参数。如果构造函数没有参数,该构造函数为默认构造函数。

      举例 默认的构造函数

      

    class A
    {
    private:
        char m_Username[128];
        char m_Password[128];
    public:
        A()
        {
            strcpy(m_Username,"MR");
            strcpy(m_Password,"KJ");
            cout<<"构造函数被调用!"<<endl;
        }
        char* GetUsername() const
        {
            return(char*)m_Username;
        }
        char* GetPassword() const
        {
            return(char*)m_Password;
        }
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        A a1;              //定义A的对象,调用默认构造函数
        A * pa = new A();  //定义A的对象,调用默认构造函数
        delete pa;         //释放pa
        return 0;
    }

      示例:调用有参的构造函数

    class A
    {
    private:
        char m_Username[128];
        char m_Password[128];
    public:
        A()
        {
            strcpy(m_Username,"MR");
            strcpy(m_Password,"KJ");
            cout<<"构造函数被调用!"<<endl;
        }
        A(const char*pUser,const char*pPass)
        {
            strcpy(m_Username,pUser);
            strcpy(m_Password,pPass);
            cout<<"有参构造函数被调用!"<<endl;
        }
        char* GetUsername() const
        {
            return(char*)m_Username;
        }
    
        char* GetPassword() const
        {
            return(char*)m_Password;
        }
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        A a1;              //定义A的对象,调用默认构造函数
        cout<<"用户名"<<a1.GetUsername()<<endl;
        A * pa = new A("VBCDE","MBEFG");  //定义A的对象,调用有参的构造函数
        cout<<"用户名"<<pa->GetUsername()<<endl;
        delete pa;         //释放pareturn 0;
    }

    示例三  复制的构造函数按值调用

    class A
    {
    private:
        char m_Username[128];
        char m_Password[128];
    public:
        A()
        {
            strcpy(m_Username,"MR");
            strcpy(m_Password,"KJ");
            cout<<"构造函数被调用!"<<endl;
        }
        A(const A &ra)
        {
            strcpy(m_Username,ra.m_Username);
            strcpy(m_Password,ra.m_Password);
            cout<<"复制构造函数被调用!"<<endl;
        }
        char* GetUsername() const
        {
            return(char*)m_Username;
        }
    
        char* GetPassword() const
        {
            return(char*)m_Password;
        }
    };
    void OutputUser(A a)
    {
        cout<<a.GetUsername()<<endl;
        cout<<a.GetPassword()<<endl;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        A a;           //调用构造函数
        OutputUser(a);  //调用复制构造函数
        return 0;
    }

      如果按引用调用如何呢?

    我们只需更改  

    void OutputUser(A &a)   //按引用调用
    {
        cout<<a.GetUsername()<<endl;
        cout<<a.GetPassword()<<endl;
    }

      则不会调用复制构造函数

    从上分析可以得知,如果按值调用,则调用复制构造函数,如果按引用调用,则不会调用复制构造函数。

      析构函数

      析构函数是在对象释放时调用,进行对象的清理,那对象是何时被释放呢?如果对象是在栈中创建,则对象其作用域消失时释放如:

    {

      A a;

    }

      如果对象在堆中创建,则使用delete运算符作释放掉该对象。与构造函数类似,如果用户没有显示提供析构函数,则系统提供默认的析构函数。使用析构函数只需在函数名前加“~”符号。析构函数没有参数。析构函数也没有返回值。因此,析构函数不能够被重载。一个类只有一个析构函数。

      示例 析构函数

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include <tchar.h>
    #include<iostream>
    using namespace std;
    //---------------------------------------------------------------------------
    
    #pragma argsused
    class A
    {
    private:
        char m_Username[128];
        char m_Password[128];
    public:
        A()
        {
            strcpy(m_Username,"MR");
            strcpy(m_Password,"KJ");
            cout<<"构造函数被调用!"<<endl;
        }
        A(const A &ra)
        {
            strcpy(m_Username,ra.m_Username);
            strcpy(m_Password,ra.m_Password);
            cout<<"复制构造函数被调用!"<<endl;
        }
        ~A()
        {
            strcpy(m_Username,"");
            strcpy(m_Password,"");
            cout<<"析构函数被调用!"<<endl;
        }
    
    };
    void OutputUser(A a)
    {
    
        cout<<"调用OutputUser函数"<<endl;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        A a;
        OutputUser(a);
        return 0;
    }
    //---------------------------------------------------------------------------

    此程序一共调用了2次析构函数,当创建一个类A对象的时候,构造函数被调用,而调用OutputUser函数的时候,调用复制复制构造函数的对象拷贝到outputuser中,结果输出了复制构造函数被调用,而通过复制的构造的构造函数被调用结束是,析构函数被调用,而最后在mian函数中要结束时,A对象作用域也就消失,又会调用一次析构函数,所以析构函数会被调用2次。

  • 相关阅读:
    贷款计算公式
    P2P行业专业术语(最全)
    p2p投资理财入门篇(新手必备)
    2015年p2p网络借贷平台的发展现状
    MyEclipse中SVN的常见的使用方法
    linux下打开、关闭tomcat,实时查看tomcat运行日志
    Spring 向页面传值以及接受页面传过来的参数的方式
    Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
    PowerDesigner概述(系统分析与建模)以及如何用PowerDesigner快速的创建出这个数据库
    MySQL 8.x 函数和操作符,官方网址:https://dev.mysql.com/doc/refman/8.0/en/functions.html
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4033203.html
Copyright © 2011-2022 走看看