一. 构造函数中成员变量的赋值与成员变量的初始化
1. 构造函数体内成员变量的赋值
构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
2. 构造函数体外成员变量的初始化
2.1 初始化列表概念
成员变量的初始化是在构造函数的初始化列表中的。
写在构造函数的参数列表后,函数体外
以冒号开始,以逗号分隔,最后不需要任何符号
需要初始化的值放在成员变量的后面
2.2 初始化列表的几点说明
注意区分成员变量的声明和定义
每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
引用成员变量,const成员变量,没有默认构造函数的自定义类型成员变量必须放在初始化列表位置进行初始化。
成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
3. explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。
二. static成员
1. 概念
2. 特性
静态成员为所有类对象所共享,不属于某个具体的实例
静态成员变量必须在类和main函数外的全局范围定义,定义时不添加static关键字
静态成员函数类里或者类外都可以定义,类外定义时不加static
类静态成员即可用类名::静态成员或者对象.静态成员来访问
静态成员函数没有隐藏的this指针,不能访问任何非静态成员;因为静态成员变量是类所共有的,所以静态成员变量函数可以突破类域和访问限定符来访问静态成员。
静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值。
3. 问题
静态成员函数可以调用非静态成员函数吗?(不行)
非静态成员函数可以调用类的静态成员函数吗?(可以)
三. C++11 的成员初始化新玩法
C++11支持非静态成员变量在声明同时给声明的成员变量缺省值(实际的缺省值还是以构造函数的为准)
四. 友元
1. 概念
友元分为:友元函数和友元类
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
2. 友元函数
2.1 概念
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类。
问题:既然是为了访问类的私有成员,那我们干脆把函数定义为类的成员函数不就行了吗,友元函数有什么用呢?
其实在一些情况下,必须要定义出友元函数才能解决问题(比如我们要重载输入输出的<<和>>操作符时)
2.2 特性
友元函数可访问类的私有和保护成员,但不是类的成员函数
友元函数不能用const修饰(因为他不是类的成员函数)
一个函数可以是多个类的友元函数
友元函数的调用与普通函数的调用和原理相同
3. 友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的所有成员。
友元关系是单向的,不具有交换性。(B是A的友元函数,所以B类中可以直接访问A类的所有成员;但是A类只能访问B类的公有成员,不能访问B类的私有的成员)
友元关系不能传递(如果B是A的友元,C是B的友元,则不能说明C时A的友元。)
五. 内部类
1. 概念
如果一个类定义在另一个类的内部,这个定义在内部的类就叫做内部类。
2. 特性
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类
内部类就是外部类的友元类(a. 内部类可以直接访问外部类的成员 b. 外部类不是内部类的友元,外部类对内部类没有任何优越的访问权限)
内部类可以定义在外部类任何位置
sizeof(外部类)=外部类,和内部类没有任何关系