构造函数相关知识

构造函数

在C++11标准之前,编译器不允许类的成员变量在定义的时候直接被赋值

private:
    int score=60; //Compile Error

因此,若想将对象内的成员变量初始化,需要用到构造函数
构造函数是一种特殊的成员函数,一般用于初始化对象,函数名与类名相同,无函数类型,无返回值,在系统创建对象时自动调用;构造函数可以有多个(重载),但每个构造函数的参数必须不同(个数、类型不完全相同)。构造函数一般定义在public

无参构造函数

没有参数,不能被重载,即每个类最多有一个无参构造函数。

class Date
{
private: 
    int b;
public:
    Date(){ //无参数的构造函数
        b=666; //对b进行初始化
    }
};

用无参构造函数定义对象

Date d; 

这种所谓“正常的声明方式”其实就是运用无参构造函数的声明方式。此时对象d中b=666

有参构造函数

可以被重载,即可以有很多个参数类型或个数不同的有参构造函数

class Date
{
private:
    int b, c;
public:
    Date(int B){ //一个参数的构造函数
        b=B; //用参数赋值
        c=666; //也可以随意赋值
    }
    Date(int B, int C){ //两个参数的构造函数
        b=B;
        c=C;
    }
};

用有参构造函数定义对象

Date m(10); //第一个有参构造函数
Date n(1,2); //第二个有参构造函数

对象m定义的时候,括号里只有一个参数,则自动匹配第一个有参构造函数;对象n定义的时候括号里有两个参数,自动匹配到第二个有参构造函数。
对象m中b=10,c=666,对象n中b=1,c=2

默认构造函数

如果用户没有定义构造函数,系统会自动创建一个无参构造函数,称为默认构造函数;但如果用户自己定义了构造函数(无论是有参还是无参),系统将不再自动创建无参构造函数。
也就是说,若只定义有参构造函数,由于系统不再自动生成无参构造函数,会导致缺乏无参构造函数,即不能再用下面这种形式定义对象

Date d;

只有当用户自己补充无参构造函数后,才可以这样定义。

拷贝构造函数

拷贝构造函数用于以现有对象为模版创建新的对象,可以实现部分复制。拷贝构造函数的函数名同类名,无返回值,参数仅有一个,为对象的引用。

class Date
{
private:
    int b,c;
public:
    Date(){ //打酱油的无参构造函数
        b=999;c=666;
    }
    Date(Date &p){ //拷贝构造函数
        b=p.b+1; //用已有对象p给新对象赋值
        c=66; 
    }
};

用拷贝构造函数定义对象

Date m,n(m);

m是用无参构造函数定义的对象,m中b=999,c=666;n是用拷贝构造函数定义的对象,以m为模版,n中b=999+1=1000,c=66

默认的拷贝构造函数

用户未声明拷贝构造函数时,系统自动创建一个默认的拷贝构造函数,将模版对象的数据全部复制到新创建的对象中。

析构函数

函数名同类名,并在函数名前加~,无函数类型,无返回值,无参数,不可重载,在对象寿命结束的时候被系统自动调用,用于释放所创建的对象。
波浪线是英文波浪线!

class Date{
private:
    int b,c;
public:
    ~Date(){ //析构函数
        cout<<"666"; //随便写
    }
};

当用户没有自己定义析构函数时,系统会创建默认的析构函数。

整体回顾

建议把这段代码自己照着敲几遍,然后运行,看看结果。

#include<iostream>
using namespace std;
class Date{
private:
    int year, month, day;
public:
    Date(){ //无参构造函数
        year=1413, month=5, day=20;
        cout<<"无参构造被调用"<<endl;
    }
    Date(int Y, int M){ //有参构造函数1
        year=Y, month=M, day=4;
        cout<<"有参构造1被调用"<<endl;
    }
    Date(int Y, int M, int D){ //有参构造函数2
        year=Y, month=M, day=D;
        cout<<"有参构造2被调用"<<endl;
    }
    Date(Date& d){ //拷贝构造函数
        year=d.year-99;
        month=d.month;
        day=d.day+1;
        cout<<"拷贝构造函数被调用"<<endl;
    }
    ~Date(){ //析构函数
        cout<<"析构函数被调用"<<endl;
    }
    void print(){ //用于输出的函数
        cout<<year<<" "<<month<<" "<<day<<endl;
    }
};
int main()
{
    Date d0;//用无参创建对象
    Date d1(2000,11);//用有参1创建对象
    Date d2(2001,6,26);//用有参2创建对象
    cout<<"d0: ";d0.print();
    cout<<"d1: ";d1.print();
    cout<<"d2: ";d2.print();
    Date dd(d0);//用拷贝创建对象(模版是d0)
    cout<<"dd: ";dd.print();
    return 0;
}

运行结果:

无参构造被调用
有参构造1被调用
有参构造2被调用
d0: 1413 5 20
d1: 2000 11 4
d2: 2001 6 26
拷贝构造函数被调用
dd: 1413 5 21
析构函数被调用
析构函数被调用
析构函数被调用
析构函数被调用

本人是在读大学生,系列教程主要为了便于我的同学们参考,其中可能有很多不妥之处,望各位大佬雅正。
公众号:网织青春zcwlgc2019

猜你喜欢

转载自blog.csdn.net/pyx2466079565/article/details/106173730
今日推荐