构造函数
在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