[C++从入门到精通] 11.回顾类内初始化、默认构造函数、=default

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • [一. 回顾类内初始化成员变量](#一. 回顾类内初始化成员变量)
      • [二. 默认构造函数](#二. 默认构造函数)
      • [三. =default;和=delete;](#三. =default;和=delete;)

一. 回顾类内初始化成员变量

1、描述

C++11里,我们可以为类内成员变量提供一个初始值,那么我们在创建对象的时候,这个初始化值就用来初始化该成员变量。

普通成员变量不给初值的话,系统会默认给其一个缺省值(一个不确定的值),静态成员变量不给初值的话,系统会默认赋予零值。

2、类内成员变量初始化的方式

1)头文件内定义成员变量的时候直接赋予初值
cpp 复制代码
class Time 
{
	Q_OBJECT

public:
	Time();
    int m_num = 10;    //方式1
    int m_num = {10};  //方式2
2)构造函数初始化列表(推荐,显得更专业)

参考:[C++ 从入门到精通] 8.构造函数详解、explicit、初始化列表

注意:

const常量成员变量的初始化方式不可以在定义完常量成员变量之后,在构造函数里面进行初始化:

cpp 复制代码
class Time 
{
	Q_OBJECT

public:
	explicit Time();  //默认构造函数
    //const int m_num = 10; //可以
    const int m_num;
cpp 复制代码
Time::Time()
{
	Minute = 10;  //不可以,报错表达式必须是可修改的左值
}
cpp 复制代码
Time::Time():Minute(10)  //构造函数初始化列表方式,可以
{

}

二. 默认构造函数

1、定义:没有参数的构造函数,我们称为默认构造函数。

2、如何初始化类对象?

在生成类的对象时,会自动调用类的构造函数(构造函数初始化列表)来初始化成员变量。

cpp 复制代码
class Time
{
public:
	Time() {};
	int Hour;
	int Minute;
};

Time::Time() :Hour(12), Minute(50)
{

}
cpp 复制代码
int main()
{
	Time myTime;  //生成的对象没有参数,所以会调用默认构造函数
	return 0;
}

3、如果没有构造函数,如何初始化类对象?

cpp 复制代码
class Time
{
public:
	//Time() {};
	int Hour;
	int Minute;
};
cpp 复制代码
int main()
{
	Time myTime;  
	return 0;
}

我们看到,即使屏蔽了函数所有的构造函数,在生成对象时,成员变量依然被系统赋予了一个默认的初始值。原因是 在我们 定义时,如果没有构造函数的情况下,编译器就会为我们隐式的自动定义一个默认构造函数(无参),称为"合成的默认构造函数"。

4、合成的默认构造函数的作用:在没有构造函数的情况下,如果在定义成员变量的时候没有对其进行初始化,系统会在合成的默认构造函数中为其赋予一个默认初始值。如果在定义成员变量的时候对其进行了初始化,则在生成类对象时,其成员变量的初始值不变。

5、总结:

1)没有参数的构造函数,我们称为默认构造函数。在生成无参数的类对象时,会自动调用默认构造函数。

2)一般我们在定义类的时候都需要自定义一个构造函数对成员变量进行初始化的,这是比较正规的写法,合成的默认构造函数这个概念我们了解一下就好。


三. =default;和=delete;

1、=default;

=default;C++11标准中引入的概念,编译器能够为=default;的函数自动生成函数体,相当于定义了一个默认构造函数(不带参数):

cpp 复制代码
class Time
{
public:
    //Time() {};  
	Time() = default;  //适合默认构造函数,效果和上面等价
	Time(int) = default;  //不可以,报错"Time::Time(int)": 不是可默认为的特殊成员函数
};

注:只有特殊函数(默认构造函数、析构函数、拷贝构造函数等)才可以使用= default;。非特殊函数(带参数的构造函数、普通成员函数)不可以使用= default;= default;等价于{}

2、=delete;

=delete;:显示的禁用某个函数。

cpp 复制代码
class Time
{
public:
	Time() = delete;  //禁止系统生成合成的默认的构造函数
};

这时,我们在生成类对象时:

cpp 复制代码
int main()
{
	Time myTime;  //失败,由于没有默认构造函数,系统也无法自动生成合成的默认构造函数
	return 0;
}

|-------------------------------------|
| 下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |

相关推荐
CYBEREXP20081 小时前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos1 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
tianmu_sama2 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
羚羊角uou2 小时前
【C++】优先级队列以及仿函数
开发语言·c++
姚先生972 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵
FeboReigns2 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns2 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++
264玫瑰资源库3 小时前
从零开始C++棋牌游戏开发之第二篇:初识 C++ 游戏开发的基本架构
开发语言·c++·架构
_小柏_3 小时前
C/C++基础知识复习(43)
c语言·开发语言·c++