【C++】深入理解类和对象中构造函数

news/2024/5/19 1:02:09 标签: c++, 类和对象, 构造函数

六大默认成员函数中,介绍了构造函数的作用,使用方法。

这份代码中:

class Date
{
public:
	Date(int year, int month, int day)//构造函数
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

void TestClass()
{
	Date d1(2020,10,6);
	Date d2(2020, 10, 1);
}

经过上述函数调用之后,虽然对象已经有了初始值,但并不能称之为对象的初始化。在构造函数中的语句只能称作为赋值,函数体中赋值可进行多次,但初始化只有一个。

对象的初始化是用初始化列表来操作的。

初始化列表: 以冒号开始,接着用每一个逗号分割成员变量列表,每个成员变量后跟一个括号,放入要初始化的变量或表达式。

例:如上述代码初始化

class Date
{
public:
	Date(int year, int month, int day)//构造函数
		: _year(year)
	     ,_month(month)
	     ,_day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};

void TestClass()
{
	Date d1(2020,10,6);
	Date d2(2020, 10, 1);
}

初始化列表中注意事项:

  1. 每个成员变量在初始化列表中只能出现一次
  2. 类中有以下成员变量,必须使用初始化列表对成员变量初始化
  • 引用成员变量
    在这里插入图片描述
  • const成员变量
    在这里插入图片描述
  • 自定义类型成员(类中没有默认构造函数)
    在这里插入图片描述
  1. 尽量使用初始化列表进行初始化。 无论是否使用初始化列表,对于自定义类型的成员变量,一定会优先使用初始化列表初始化。
  2. 成员变量在类中的声明次序,就是初始化列表中的初始化顺序。与其初始化列表中先后次序无关。
class Date
{
public:
	Date(int year, int month, int day)//构造函数
		: _year(year)
		, _day(day)
		, _month(_day)
	{}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

void TestClass()
{
	Date d1(2020,10,6);
	Date d2(2020, 10, 1);
	d1.Print();
}

那么其输出结果是什么呢?在这里插入图片描述
编译器仍是先对month进行初始化,再对day。所以上述month就打印了随机值,因为还未对day进行初始化,就是随机值。

注意:构造函数都有初始化列表,即使用户未写,编译器也会自动补上,依旧会执行初始化列表的部分。


http://www.niftyadmin.cn/n/1664539.html

相关文章

使用Spring Data Redis操作Redis(二)

1. Redis的Pub/Sub命令 Redis的订阅和发布服务有如下图6个命令&#xff0c;下面分别对每个命令做简单说明。 publish: 向指定的channel(频道)发送message(消息) subscribe:订阅指定channel&#xff0c;可以一次订阅多个 psubscribe:订阅指定pattern(模式&#xff0c;具有频道名…

【Linux学习笔记】18:脚本执行方式

在Linux中可以写一些自己要用的脚本&#xff0c;这节学习怎么执行它们。 补充&#xff1a;echo把指定内容输出到屏幕 echo [选项] [输出内容] 选项&#xff1a;-e支持反斜杠支持的字符转换。 这些字符有\a输出警告音&#xff0c;\b退格键&#xff0c;\n换行符&#xff0c;\…

【C++】浅谈static关键字的在C语言和C++的作用

C语言中&#xff1a; 作用一&#xff1a;修饰变量。 变量分为局部变量和全局变量&#xff0c;则用static修饰&#xff0c;也分为静态局部变量和静态全局变量。 静态局部变量&#xff1a;在函数体中使用static修饰变量&#xff0c;可改变生命周期&#xff0c;但不能改变作用域…

dp的刷表法和填表法

dp的刷表法和填表法 参考&#xff1a; 动态规划刷表法 - acmer_xue的博客 - CSDN博客http://blog.csdn.net/qq_30241305/article/details/52198780 一.先简单讲下什么是填表法&#xff0c;什么是刷表法。 填表法 &#xff1a;就是一般的动态规划&#xff0c;当前点的状态&#…

【Linux学习笔记】19:Bash基础-命令别名与快捷键

Bash是Linux的标准Shell&#xff0c;它里面有很多非常有用的功能。最近几节都学习它们&#xff0c;但不牵扯到Shell编程的知识。 命令的别名就是它另外的名字&#xff0c;因为有的命令很长&#xff0c;所以给它起个别名&#xff0c;这样就可以使操作变得简单。另外是有时候因为…

3G使人类进入无纸化时代

无线阅读越来越成为人们关注的一个热点&#xff0c;随着亚马逊推出便携式无线阅读器Kindle&#xff0c;无线阅读被巨头认可并付出了具体的实际行动。索尼公司也售价不足300美元的触摸屏“读者触摸版”阅读器。国内的公司也在追赶&#xff0c;大唐电信高调宣布将推出“TD电子阅读…

去哪儿网基于Mesos和Docker构建私有云服务的实践

【编者的话】本文深入介绍了去哪儿网利用Mesos和Docker构建私有云服务的全过程&#xff0c;分享了从无状态应用向有状态应用逐步过度的经验与心得。平台概览 2014年下半年左右&#xff0c;去哪儿完成了有关构建私有云服务的技术调研&#xff0c;并最终拍定了Docker/Mesos这一方…

MySQL主从架构

关系型/非关系型【数据库】知识脉络 系列文章之 MySQL高可用&#xff1a;主从架构 前言 mysql为实现高可用&#xff0c;可实现主从架构&#xff1a;一主一从&#xff0c;一主多从&#xff0c;互为主从等&#xff0c;在此基础上优化性能可读写分离&#xff0c;分库分表&#xf…