【C++初阶】类和对象(下)再谈构造函数、static成员、C++11的成员初始化新玩法、友元类、内部类

再谈构造函数

1.构造函数体赋值
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。
在这里插入图片描述
在这里插入图片描述
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
2.初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
在这里插入图片描述
注意
2.1 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
在这里插入图片描述
在这里插入图片描述
2.2 类中包含以下成员,必须放在初始化列表位置进行初始化:
a. const修饰的成员变量
在这里插入图片描述

在这里插入图片描述
我们以前学过,const修饰的变量在定义后是,不能修改的,只能在定义的时候进行赋值,所以只能在初始化列表初始化。

在这里插入图片描述
在这里插入图片描述
b. 引用成员变量
在这里插入图片描述
在这里插入图片描述
修改后
在这里插入图片描述

在这里插入图片描述
c. 自定义类型成员变量(该类没有默认构造函数
在这里插入图片描述
在这里插入图片描述
修改后
在这里插入图片描述
在这里插入图片描述
2.3尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化

2.4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
下面我们来看一道例题
在这里插入图片描述
A. 输出1 1
B.程序崩溃
C.编译不通过
D.输出1 随机值
相信在看过第4点后大家都知道应该选什么,没错就是选D,大家如果没学过第四点肯定有大部分人会想选A。
3. explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。
在这里插入图片描述
我们在这里可以看到d1和d2两种构造方式,其实第二个是赋值构造,其中发生了隐式转换。它先把2022隐式转换成临时日期类,再把临时日期类赋值给d2.
而要避免这种情况得发生就要用explicit关键字来限制它。
在这里插入图片描述
在这里插入图片描述

static成员

概念
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化
在这里插入图片描述
在这里插入图片描述
下面我们来看一道牛客网的有关真题
在这里插入图片描述
这题本来是很简单的,但是因为限制了很多都方法,所以我们肯能会无从下手,其实这里我们运用到了一个巧解。
在这里插入图片描述
在这里插入图片描述
本题牛客网链接
大家有兴趣也可以再试试看有没有其它方法
总结

  1. 静态成员为所有类对象所共享,不属于某个具体的实例
  2. 静态成员变量必须在类外定义,定义时不添加static关键字
  3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

C++11的成员初始化新玩法

C++11支持非静态成员变量在声明时进行初始化赋值,但是要注意这里不是初始化,这里是给声明的成员变量缺省值。
在这里插入图片描述
在这里插入图片描述
如果初始化了类,便不会给成员变量缺省值
在这里插入图片描述
在这里插入图片描述

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
友元关系是单向的,不具有交换性。

比如Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量
在这里插入图片描述
但想在Time类中访问Date类中私有的成员变量则不行。
在这里插入图片描述
在这里插入图片描述
友元关系不能传递
如果B是A的友元,C是B的友元,则不能说明C时A的友元。

内部类

概念
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。
特性:
1.内部类可以定义在外部类的public、protected、private都是可以的。
2. 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
在这里插入图片描述
在这里插入图片描述

3 sizeof(外部类)=外部类,和内部类没有任何关系。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值