zoukankan      html  css  js  c++  java
  • C++ 构造函数

    1.构造函数的作用

    在创建对象时,编译器会自动调用构造函数,初始化成员变量。

    2.定义

    • 构造函数名是类名;
    • 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
    • 函数体中不能有 return 语句。
    #include <iostream>
    using namespace std;
    class Date {
    public:
        Date(){};//定义默认构造函数
        void setDate(int y,int m,int d) {
            m_year=y;m_month=m;m_day=d;
        };
        void showDate(){
            cout<<"year:"<<m_year<<", mouth:"<<m_month<<", day:"<<m_day<<endl;//可以访问类中数据成员
        };
    private:
        int m_year;
        int m_month;
    public:
        int m_day;
    };

    3.构造函数重载

    和普通成员函数一样,构造函数是允许重载的。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。

    构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象时就一定要调用,不调用是错误的。如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配;反过来说,创建对象时只有一个构造函数会被调用。

    如下示例有两种构造函数:

    #include <iostream>
    using namespace std;
    class Date {
    public:
        Date(){
            m_year=0;m_month=0;m_day=0;
        };//定义构造函数
        Date(int y,int m,int d) {
            m_year=y;m_month=m;m_day=d;
        };
        void setDate(int y,int m,int d) {
            m_year=y;m_month=m;m_day=d;
        };
        void showDate(){
            cout<<"year:"<<m_year<<", mouth:"<<m_month<<", day:"<<m_day<<endl;//可以访问类中数据成员
        };
    private:
        int m_year;
        int m_month;
        int m_day;
    };
    int main(){
        Date date1;//调用第一种构造函数
        Date date2(2020,2,11);//调用第二种构造函数
        date1.setDate(2020,2,10);//访问对象的成员函数
        date1.showDate();//year:2020, mouth:2, day:10
        date2.showDate();//year:2020, mouth:2, day:11
        return 0;
    }

    4.默认构造函数

    如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。比如上面的 Date 类,默认生成的构造函数如下:

    Date(){};

    注意:

    • 一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。
    • 一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。
    • 调用没有参数的构造函数也可以省略括号

    对于上面Date的例子,在栈上创建对象可以写作Date date()Date date,在堆上创建对象可以写作Date *date= new Date()或Date *date = new Date,它们都会调用构造函数Date()。

    具体内存分配可参照:https://www.cnblogs.com/AntonioSu/p/12273116.html

  • 相关阅读:
    html中frameset的详细使用方法
    日期控件API
    限制input输入类型(多种方法实现)
    springmvc导出excel并弹出下载框
    Spring mvc 验证码的做法
    Spring Boot 集成MyBatis
    Spring Boot 实践折腾记(三):三板斧,Spring Boot下使用Mybatis
    支付系统架构
    javaScript事件(六)事件类型之滚轮事件
    你不是真正的快乐
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/12290571.html
Copyright © 2011-2022 走看看