1. 类内初始化
1.1 声明时初始化成员变量
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
int m_Hour = 8; //可以在声明时为类内对象提供初始值
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
int main() {
Time time1;
cout << time1.m_Hour << endl; //8
}
1.2 const成员变量的初始化
const成员变量的初始化主要通过两种方式:
(1)在变量声明时给初值进行初始化。
(2)利用构造函数的初始化列表进行初始化。
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
int m_Hour = 8;
const int m_Minute = 18; //const成员变量,在声明时为类内对象提供初始值
const int m_Second;
public:
Time(int hour);
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
Time::Time(int hour) : m_Second(18) //const成员变量可以利用构造函数初始化列表进行初始化
{
m_Hour = hour;
// m_Minute = 10; //错误,const成员变量不可通过赋值进行初始化
// m_Second = 5;
}
int main() {
Time time1(18);
cout << time1.m_Hour << ":" << time1.m_Minute << ":" << time1.m_Second << endl; //18:18:18
}
2.默认构造函数
2.1 定义
不带参数的构造函数被称为默认构造函数。
类定义中,在没有构造函数的情况下,系统会自动为我们隐式的定义一个默认构造函数。
一旦我们自己定义了一个构造函数,不管该构造函数带几个参数,编译器都不会为我们创建合成的默认构造函数了。
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
int m_Hour;
int m_Minute;
public:
Time(int); //创建了带一个参数的构造函数,此时系统不会为我们创建默认构造函数了
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
Time::Time(int): m_Hour(18) {}
int main(){
Time time1(10);
// Time time2; //错误,此时已经没有不带参数的构造函数了(默认构造函数)
}
必须自己写构造函数的情况
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
class OtherClass{
public:
OtherClass(int ){};
};
//类的声明
class Time
{
public:
int m_Hour;
int m_Minute;
public:
Time(); //为了初始化otherclass的对象,因此不能使用系统的默认构造函数,需要自己实现Time的构造函数
OtherClass otherclass;
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
//构造函数初始化
Time::Time(): otherclass(10){};
int main(){
Time time1();
}
2.2 =default
在特殊的函数中,利用=default替代{}
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
Time(); //默认构造函数
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
Time::Time() = default; //等价于Time::Time(){}
int main() {
Time time1;
}
2.3 =delete
=delete:让程序员显示的禁用某个函数
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
Time()=delete; //不让系统自动生成默认构造函数
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
int main() {
// Time time1; //错误,此时系统不再提供默认构造函数
}