【C++ 基础篇:19】:类的构造函数与初始化列表:用法说明及构造函数的细节内容补充!

本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 STL 库设计实现高阶数据结构,如 B树、B+树、红黑树等。

学习集:


本期内容:【C++ 基础篇:19】:类的构造函数与初始化列表:用法说明及构造函数的细节内容补充!


相关内容:
C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题


目录:
1. 再谈构造函数:赋值 & 初始化
2. 初始化列表基本认识及使用
- - 2.1 基本认识及使用写法
- - 2.2 注意点说明(超重点!)
3. 相关文章推荐


C++学习合集链接


1. 再谈构造函数:赋值 & 初始化

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。【此前学习后的基本写法如下】

class Date
{
public :
    Date(int year = 1900, int month = 1, int day = 1)
    {
       _year = year;
       _month = month;
       _day = day;
    }
private:
    int _year ;
    int _month ;
    int _day ;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化构造函数体中的语句只能将其称为赋初值,而不能称作初始化


因为初始化只能初始化一次,而构造函数体内可以多次赋值


2. 初始化列表基本认识及使用

2.1 基本认识及使用写法

初始化列表

  • 以一个冒号开始,接着是一个以逗号分隔的数据成员列表
  • 每个"成员变量"后面跟一个放在括号中的初始值或表达式。

上述示例修改:程序代码如下:

class Date
{
public:
    Date(int year = 1900, int month = 1, int day = 1)
        :_year(year)		/* 初始化列表的基本写法 */
        ,_month(month)		/* 冒号开头 */
        ,_day(day)			/* 数据成员间,逗号间隔 */
    {

    }
private:
    int _year;
    int _month;
    int _day;
};

2.2 注意点说明(超重点!)
  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
  2. 类中包含以下成员,必须放在初始化列表位置进行初始化
  • 引用成员变量(引用必须在定义的地方初始化)
  • const 成员变量(const 修饰的变量必须在定义的地方初始化)
  • 自定义类型成员(且该类没有默认构造函数时)
  1. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
  2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关!
  3. 注:初始化列表不能初始化静态成员变量(静态成员变量【类内声明】只能在类为定义)

类中包含以下成员,必须放在初始化列表位置进行初始化

  • 引用成员变量(引用必须在定义的地方初始化)
  • const 成员变量(const 修饰的变量必须在定义的地方初始化)
  • 自定义类型成员(且该类没有默认构造函数时)

错误示例情况如下图:

在这里插入图片描述

正确写法!如下!

class A
{
public:
	A(int a)
		:_a(a)
	{}
private:
	int _a;
};
class B
{
public:
	B(int a, int ref)
		:_aobj(a)		
		, _ref(ref)
		, _n(10)
	{}
private:
	A _aobj;		// 没有默认构造函数
	int& _ref;		// 引用
	const int _n;	// const
};

「成员变量」在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关!【如下图解析所示】

在这里插入图片描述


3. 相关文章推荐

1. C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
2. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
3. C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
4. C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数
5. C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用
6. C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现
7. C++ 学习 ::【基础篇:18】:C++ 类的基本成员函数:error C2801: “operator =”必须是非静态成员 | 赋值运算符的重载的说明及其写法(特殊点)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPC的白话文谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值