C++基础 类和对象(三)
一.初始化列表
语法格式:
![]()
1.为什么要使用初始化列表
很多人以为
和
效果一样
实际上并不一样。
普通赋值:
过程:
先调用成员变量默认构造
再进行赋值
相当于:x先被创建
然后x = 10
初始化列表:
x在创建时直接变成10
少了一次“先创建再赋值”的过程,效率更高。
示例:
输出:张三 18
2.初始化列表的执行顺序
初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆ 关。建议声明顺序和初始化列表顺序保持⼀致。
真正顺序:a先初始化
b后初始化
3.哪些成员必须使用初始化列表初始化
1.const成员
因为const变量定义后不能再赋值
2.引用成员
引用必须在定义时绑定
3.没有默认构造的对象成员
无法默认构造。
总结:
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表; ⽆论是否在初始化列表显⽰初始化成员变量,每个成员变量都要⾛初始化列表初始化;
二.static成员
1.静态成员变量
输出:3
为什么是3?
因为count 是所有对象共享的
每一次创建对象
2.static成员变量特点
1.属于整个类,不是对象独有,所有对象共用一份。
2.不在对象中存储
3.必须类外定义
4.类内只是声明
5.静态成员也是类的成员,受public、protected、private访问限定符的限制。
3.static成员访问方式
1.类名访问
2.对象访问
4.静态成员函数
输出:
5.静态成员函数特点
1.没有 this 指针
2.属于类
6.静态成员函数只能访问静态成员
错误示例:
没有this不知道_a属于哪个对象
7.⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
8.静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员 变量不属于某个对象,不⾛构造函数初始化列表。
三.友元
友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类 声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。
1.友元函数
输出:10
2.友元函数的特点
1.不是成员函数
2.友元关系是单向的
A是B的友元
不代表B也是A的友元
3.⼀个函数可以是多个类的友元函数。
3.友元类
一个类可以成为另一个类的友元。
输出:100
友元类关系不能传递,如果A是B的友元,B是C的友元,但是A不是C的友元。
有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多⽤
四.内部类
如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在 全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。
这里B就是A的内部类
内部类默认是外部类的友元类
内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考 虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其 他地⽅都⽤不了。
五.匿名对象
⽤类型(实参)定义出来的对象叫做匿名对象,相⽐之前我们定义的类型对象名(实参)定义出来的 叫有名对象
输出:
这里 A()创建了一个对象,但没有名字,所以叫匿名对象
匿名对象的特点:
1.没有对象名
2.生命周期只有当前语句
这一句结束,对象立即销毁
