新的一年,大家新年快乐!!
构造函数:
不论是构造函数还是析构函数都是可以在类内或者类外定义:如下
类内:
class A{
private:
略
public:
A(){...这里就省略了}//这个便是构造函数的定义方式
~A(){同上}//相比构造函数,为了区分析构函数,前面加一个小波浪
}
类外:
class A{
private:
略
public:
A();
~A();
}
A::A(形参){
函数体
}
A::~A(形参){
函数体
}
1、构造函数名必须和类名一样
2、构造函数没有返回值,相比之下析构函数既没有返回值,也没有参数,故不能重载
3、可以重载,但析构函数不能重载
4、如果没写构造函数,系统会自动生成一个构造函数,但这个构造函数并不会有任何实质的影响只是生成一个而已,并没有用,所以我们最好还是自己写上
5、定义对象的时候,系统会自动调用构造函数,通过构造函数来构造对象,一样当一个变量生命周期结束的时候,会自动调用析构函数
6、一般都会把构造函数弄成公有但是析构函数只能是公有
构造函数,既可以在传入的参数中来初始化值,也可以在函数体中来赋值。
总结:构造函数可以写参数也可以不写参数,参数属于我们在构造变量的时候需要传入的参数。
比如:
class Date
{
private:
int year; //年
int month;//月
int day; //日
public:
Date(int y, int m, int d); //构造函数
void Output(); //输出函数
};
Date::Date(int y, int m, int d) //定义构造函数
{
year = y;
month = m;
day = d;
}
int main(){
Date a(2024,1,1);
}
当然同样也可以不写参数,那么在Date a的时候,就不需要后面那个小括号了
当然,在定义的时候,我们直接给传参赋值例如:
class Date
{
private:
int year; //年
int month;//月
int day; //日
public:
Date(int y, int m, int d); //构造函数
void Output(); //输出函数
};
Date::Date(int y, int m=10, int d=20) //定义构造函数
{
year = y;
month = m;
day = d;
}
这样也是可以的。不过在写默认参数一定要注意防止重定义!!!
构造函数重载(析构没有重载)
之所以重载是因为这样可以提供用户不同的初始化,这些函数名字一样,参数列表不同
同样的代码,如下:
class Date
{
private:
int year; //年
int month;//月
int day; //日
public:
Date(int y, int m, int d); //构造函数
Date(int y)//重载
{
year = y;
month = 1;
day = 1;
}
void Output(); //输出函数
};
Date::Date(int y, int m, int d) //定义构造函数
{
year = y;
month = m;
day = d;
}
最后
构造函数的初始化列表
//构造函数的初始化列表(推荐使用)
Date::Date(int y, int m, int d):year(y),month(m),day(d){}
//相等与下面
//构造函数
Date::Date(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
上下二者是一模一样的,记得初始化列表的后面{}里面,依旧可以写入语句,只不过先执行了初始化列表,继续执行括号里面的。
每日金句:
在你走向那个人的路上,也许会有更多困难,但只要你坚信这条路通往正确,一切就有意义。 祝各位新的一年,步步高升!
————雀儿