构造函数
在定义类的成员函数时,可以给他们一个初始化的默认值,也就是所有类对象的这些数据成员都具有的同样的默认值
#include <iostream>
class Data {
pra:
int year{ 2000 }, month{ 1 }, day{ 1 };
void print() {
std::cout << year << "-" << month << "-" << day;
}
};
int main()
{
Data day, day2;
day.year = 2018;
day.month = 6;
day.day = 1;
day.print();
day2.print();
}
运行结果:
2000-1-1
2000-1-1
这个Data类的所有对象的数据成员都是完全一样的,一般的,类的不同对象的数据成员的值是不一样的。对于上面的Data类,如果Data类对象的数据成员是私有的,外部函数就无法修改数据了
如何在定义类对象的时候就用不同的数据来初始化成员对象。
实际上,在定义对象的时候,编译器会自动调用一个特殊的叫做构造函数的成员函数对类对象的数据成员初始化。构造函数是函数名和类名相同且没有返回类型的类成员函数,如果函数没有定义构造函数,则编译器会自动生成一个
#include <iostream>
class Data {
public:
int year{ 2000 }, month{ 1 }, day{ 1 };
Data() {};//就这样
void print() {
std::cout << year << "-" << month << "-" << day;
}
};
其中,成员函数Data()是一个构造函数,这种不带参数(或者所有参数都具有默认值)的构造函数叫做默认构造函数
#include <iostream>
class Data {
public:
int year{ 2000 }, month{ 1 }, day{ 1 };
Data() {
std::cout << "构造函数"<<'\n';
}
void print() {
std::cout << year << "-" << month << "-" << day << '\n';
}
};
int main()
{
Data day, day2;
day.year = 2018;
day.month = 6;
day.day = 1;
day.print();
day2.print();
}
所以会先执行构造函数
也可以在定义带入参数的构造函数,在定义类对象的时候输入的实参对类对象进行初始化
#include <iostream>
using namespace std;
class Data {
int year{ 2000 },month { 1 },day{ 1 };
public :
Data (int y, int m, int d) {
year = y; month = m; day = d;
cout << "构造函数" << endl;
print();
}
void print() {
cout << year << "-" << month << "-" << day << endl;
}
};
int main()
{
Data day(2018, 8, 19);
Data day1(2021, 1, 1);
}
这里必须要是三个参数
否则就报错
如果要解决这个问题,我可以添加:
Data (){}
也可以通过default关键字来通知编译器生成默认构造函数。
Data ()=default;
#include <iostream>
using namespace std;
class Data {
int year{ 2000 },month { 1 },day{ 1 };
public :
Data() = default;
Data (int y, int m, int d) {
year = y; month = m; day = d;
cout << "构造函数" << endl;
print();
}
void print() {
cout << year << "-" << month << "-" << day << endl;
}
};
int main()
{
Data day();
Data day1(2021, 1, 1);
}
默认成员函数也可以有默认值:
#include <iostream>
using namespace std;
class Data {
int year{ 2000 },month { 1 },day{ 1 };
public :
Data() = default;
Data (int y=2000, int m=10, int d=7) {
year = y; month = m; day = d;
cout << "构造函数" << endl;
print();
}
void print() {
cout << year << "-" << month << "-" << day << endl;
}
};
int main()
{
Data day(2121);
Data day1(2021, 1, 1);
Data day2(2121, 5);
}
初始化成员列表
对于构造函数,可以在函数体前面对类的数据成员进行初始化。如:
class Data{
int year{2000},month{10},day{7};
public:
Data(int y=2000,int m=10,int day=7):year(y),month(m),day(d)
{
}
void print()
{
std::cout<<year<<month<<day;
}
};