第三章 类
第四节 类内初始化,默认构造函数, =default
1. 类相关非成员函数
- 可以将函数声明放在对应类的头文件中,但是不放在类中,函数实现放在对应类的源文件中
//在Time.h中添加
//普通函数声明
void WriteTime(Time &mytime);
//在Time.cpp中添加函数定义
//普通函数,不是类的成员函数
void WriteTime(Time &mytime){
std::cout << mytime.Hour << std::endl;
}
// main.cpp的函数实现为
#include <iostream>
#include "Time.h"
using namespace std;
int main() {
Time mytime{12, 34,3};
WriteTime(mytime);
return 0;
}
2. 类内初始化
- 在c++11中,我们可以为类内的成员变量提供一个初始值,我们在创建对象的时候,这个初始值就用来初始化该成员变量
// 创建对象的时候就进行初始化,如果构造函数中对Second有赋值,将会覆盖原始的0
int Second = 0;
3. const成员变量的初始化
- 在构造函数的初始化列表中进行,不可以通过赋值初始化,或者直接在定义const的成员变量的时候进行初始化
// 定义了一个成员常量
const int ctestvalue=90;
4. 默认构造函数
-
没有参数的构造函数,我们就称为默认构造函数
-
Time.h
#ifndef LESSION_PART_TWO_TIME_H
#define LESSION_PART_TWO_TIME_H
class Time2 {
public:
//不带参数的构造函数,默认构造函数
explicit Time2();
public:
int Hour;
int Minute;
int Second{0};
};
- Time.cpp
#include <iostream>
#include "Time.h"
Time2::Time2() {
Hour = 12;
}
- main.cpp
#include <iostream>
#include "Time.h"
using namespace std;
int main() {
//生成对象时,会调用类的构造函数的
Time2 mytime2;
return 0;
}
没有构造函数时, 类对象怎么初始化呢?
-
默认初始化,类通过一个特殊的构造函数来执行默认的初始化构成,这个函数就叫做默认的构造函数,也就是无参的构造函数
-
如果在类定义中没有构造函数的情况下,编译器就会隐式的自动定义一个默认构造函数,不带参数,无参的,被称为"合成的默认构造函数"
-
"合成的默认构造函数"的作用是什么呢? 如果有初始值,就把初始值赋给对应的成员变量,其他的就是随意赋值,一般来讲最好还是自己写构造函数
-
一旦我们自己写了一个构造函数,不管构造函数带几个参数,编译器都不会为我们创建"合成的默认构造函数"
5. =default, =delete
-
c++11标准引入的
-
=default: 编译器能够为我们自动生成函数体(带参数的构造函数不可使用,非特殊函数也不可使用)
Time2() = default;
- =delete: 让我们显式的禁用某个函数
// 没有不带参数的构造函数,所以定义对象失败
Time2() = delete;