类和对象(下)C++

1.初始化列表

1.为什么有初始化列表,它的作用?

->初始化列表,是构造函数初始化的另一种形式。

->在语法上面理解,初始化列表可以认定为是每个成员变量定义初始化的地方.

->引用成员变量,const成员变量,没有默认构造的类类型变量,他们三者必须要在自身定义时初始化。所以要将他们放在初始化列表的位置进行初始化,否则会编译报错。

2.使用形式

->以冒号作为开始标志,每个初始化以逗号作为分隔符号,每个"成员"变量后有个括号,用来放初始值或表达式。

3.C++11支持成员变量声明的位置给缺省值,主要是用于,该成员变量没有在初始化列表初始化使用的。

4.尽量使用初始化列表,因为尽管你不走初始化列表,也会走初始化列表。因为假设该成员在声明时给了缺省值,那么初始化列表会调用他的缺省值进行初始化,如果没有给缺省值,对于类置类型的成员是否初始化取决于编译器,而自定义类型,会去调用它的默认构造,如果没有相应的默认构造,又没有初始化列表。就会编译报错。

5.初始化列表的顺序,其实是按照成员变量声明的顺序来进行的。跟成员变量在初始列表出现的先后顺序无关。

例如以下例子:

2.类型转换

1.C++支持内置类型隐式类型转换为类类型对象,需要有相关类型作为构造函数的参数。

2.构造函数前面加explicit就不再支持隐式类型转换。

3.static成员

1.static修饰的成员变量,称为静态成员变量。!!!静态成员变量一定要在类外面进行初始化。

2.类静态成员变量属于所有的类对象,不属于某个具体的对象,不存在对象中,存在静态区。

3..类静态成员也是类的成员,受类域限制,也受访问限定符的限制(public protected,private)

4.static修饰成员函数,成为静态成员函数,静态成员函数没有this指针。

5.静态成员函数可以访问静态成员,不能访问非静态的,因为没有this指针。

6**.非静态的成员函数** 可以任意的访问静态成员函数静态成员。

7.突破类域可以访问静态成员 ,可以通过类名::静态成员对象.静态成员来访问静态成员和静态成员函数

8.静态成员不能在声明时给缺省值,因为缺省值是给构造函数初始化列表使用的,而静态成员不属于某一对象,所以不走初始化列表,所以也就不能给缺省值。

例题:
设已经有A,B,C,D 4个类的定义,程序中A,B,C,D构造函数调⽤顺序为?()
设已经有A,B,C,D 4个类的定义,程序中A,B,C,D析构函数调⽤顺序为?()

答案选择:E,B

**4.**友元

5.内部类

1.什么是内部类?

->一个类的定义是在另一个类的内部,!!!内部类是一个独立的类,与定义在全局的相比,他只受到类域和访问限定符的限制,所以外部类定义的对象不包括内部类。

2.内部类默认是外部类的友元类。

3.内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其 他地⽅都⽤不了。

6.匿名对象

1.用类型定义出来的是对象叫做匿名对象,而类型名+对象名定义出来的是有名对象。

2.匿名对象的生命周期只在当前那一行,一般临时定义一个对象当前用一下就可以定义临时对象。

7.对象拷贝时的编译器优化

1.现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传参过程中可以省略的拷⻉。

2.如何优化C++标准并没有严格规定,各个编译器会根据情况⾃⾏处理。当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译还会进⾏跨**⾏**跨表达式的合并优化。

今日份鸡汤:"如果没有天赋,那就一直重复!"

今天的学习就到此结束啦!谢谢大家支持!

相关推荐
std86021几秒前
Rust 与 Python – 这是未来的语言吗?
开发语言·python·rust
相偎13 分钟前
用观察者模式通知UI刷新数据
c++
2503_9301239315 分钟前
Kubernetes (六)调度策略详解:从节点匹配到Pod调度全流程
java·开发语言
曾凡宇先生15 分钟前
openEuler安装jdk,nginx,redis
linux·开发语言·数据库·openeuler
weixin_466817 分钟前
Python编程之面向对象
开发语言·人工智能·python
YBN娜29 分钟前
设计模式-创建型设计模式
java·开发语言·设计模式
CoderCodingNo31 分钟前
【GESP】C++四级真题 luogu-B4040 [GESP202409 四级] 黑白方块
开发语言·c++
小火柴1231 小时前
利用R绘制条形图
开发语言·r语言
小欣加油1 小时前
leetcode 143 重排链表
数据结构·c++·算法·leetcode·链表
沐知全栈开发1 小时前
PHP MySQL 插入数据详解
开发语言