c++类和对象基础完结篇

16 篇文章 0 订阅

再谈构造函数

之前对构造函数简单的定义就是实现成员变量的初始化功能, 起始这并不准确:
在这里插入图片描述在引入初始化列表之前, 我们只是对成员变量进行了声明和赋值而已, 并没有进行真正的初始化. 因为初始化只能进行一次, 而赋值可以进行多次.

初始化列表:

初始化列表做的事就是, 实现真正的成员变量的初始化:
在这里插入图片描述初始化列表存在的意义:
初始化列表存在的意义就是有些地方必须要用初始化列表来解决.
在这里插入图片描述引用成员变量: 引用的一大特点就是在声明的时候必须初始化, 必须要有指向的空间存在才行.
常量成员变量: 常量在定义之后就不能再次修改, 只能在声明时初始化一次, 之后就不能再赋值.
自定义成员变量: 自定义成员在声明后会调用该自定义类型的默认构造函数, 倘若没有默认构造函数, 就必须在初始化的时候将其构造函数的参数传进去.
成员变量经历的变化过程:
成员变量的声明 ---- 成员变量初始化(一次) ---- 成员变量的赋值(多次)
初始化列表初始化顺序:
在这里插入图片描述
在这里插入图片描述
按理说我们的预期应该是_a=100, _b=100.
这是因为初始化的顺序不由初始化列表的顺序决定, 而是由声明的顺序决定的.
explicit关键字:
在这里插入图片描述
将常量赋值给自定义类型, 会出现一个神奇的效果:
在这里插入图片描述
100赋值给了该自定义类型的第一个声明的成员变量. 这是因为编译器在其中做了手脚, 其实本质上是经历了下面的过程:
Tmp t_tmp(666) ---- t = t_tmp ---- 优化
可以在构造函数中加段代码来演示以下:
在这里插入图片描述在这里插入图片描述可以看出其实调用了两次构造函数.
还有一种情况:
就是直接 Tmp t = 666;
这个其实本质上经历了下面的过程:
Tmp t_tmp(666) ---- Tmp t(t_tmp) ---- 优化
在这里插入图片描述通过以上实例, 我们单个赋值, 只是赋值了第一个声明的成员变量_a, 其实c++11中可以 t = {666, 666} 这种花括号形式来赋值多个成员变量; 但是像这种代码的可读性是非常不好的, 为了避免这种情况的发生, 可以用 explicit 来修饰构造函数, 使得构造函数不支持单参构造函数的隐式转换.

static成员:

static的作用:
1.修饰局部变量: 改变生命周期
2.修饰函数, 全局变量: 改变连接属性
3.修饰成员函数, 无this变量, 属于类
4.修饰成员变量, 属于类

static修饰类成员时, 被修饰的成员不属于某个实例, 而是属于这个类, 比如说计算一个类创建了多少个对象:
在这里插入图片描述按理来说, t1(1)创建一个对象, t1=10这个过程产生了一个临时对象, 所以总共创建了2个对象, 但是:
在这里插入图片描述
调用了两次构造函数, 结果却显示创建了1个对象. 这是因为编译器优化的结果, 可以直观的认为是类型的隐式转换, 但是本质上还是需要创建一个临时对象. 所以说一个类到底创建了多少个对象, 还与编译器的优化有关. 这只是static一个简单的应用, static修饰的成员是属于类, 静态成员变量的定义在类外, 非私有的成员可以在类外通过类名直接访问.
static计算1+2+…+n:
在这里插入图片描述
在这里插入图片描述
另外, 静态成员函数不能引用非静态成员函数和变量, 因为静态成员是属于类, 而普通成员是属于某个对象. 但是非静态成员函数可以调用静态成员函数和变量.

C++11成员初始化:

在这里插入图片描述

友元:

友元函数:
在这里插入图片描述在对 << 进行重载的时候, 因为函数参数列表中 this 指针抢占了第一个位置, 因此cout只能作为右操作数, 但这种使用方式不符合我们直观的使用方式, 此时我们必须将函数定义在外部并且能正常访问类的私有成员, 这就需要友元函数来实现:
在这里插入图片描述在这里插入图片描述注:
1.友元函数可以访问类的私有成员, 但它不是类的成员函数.
2.友元函数不能用 const 修饰.
3.友元函数可以在类的任何地方声明, 不受访问限定符的限制
4.一个函数可以是多个类的友元函数
5.友元函数声明在类内, 定义在类外.
友元类:
在这里插入图片描述注:
1.友元类的所有函数都可以是另一个类的友元函数, 都可以访问另一个类的非共有成员.
2.友元关系是单向的, 友元类可以访问定义该友元类的类的私有成员, 但是内部定义友元类的类不能访问该友元类的私有成员.
3.友元不传递, A是B的友元, B是C的友元, 但A不一定是C的友元.

内部类:

在类中定义的类叫做该类的内部类. 内部类是外部类的友元类.
在这里插入图片描述
B可以访问A的私有成员, 但是A不能访问B的私有成员.
内部类通过函数参数列表为外部类来访问外部类的私有成员. 内部类可以直接通过外部类类名直接访问外部类的静态成员.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值