类和对象(下)
嘿嘿,家人们,今天咱们进入类和对象(下),好啦,废话多不讲,开干!
目录
1:再谈构造函数
1.1:构造函数体赋值
1.2:初始化列表
1.2.1:概念
1.2.1.1:代码1
1.2.1.2:代码2
1.2.1.3:代码3
1.2.2:注意事项
1.2.2.1:代码1(仅含const成员变量)
1.2.2.2:代码2(仅含引用成员变量)
1.2.2.3:代码3(仅含自定义类型成员且该自定义类型无默认构造函数)
1.2.2.3.1:无默认构造
1.2.2.3.2:有默认构造
1.2.2.4:总代码
1.2.3:初始化列表的细节知识
1.2.3.1:细节知识1(单参数构造函数支持隐式类型的转换)
1.2.3.1.1:代码1
1.2.3.1.2:代码2
1.2.3.1.3:代码3
1.2.3.2:细节知识2(多参数构造函数也支持隐式类型转换)
1.2.3.3:细节知识3
1.3:explicit关键字
1.3.1:代码1(无explicit关键字)
1.3.2:代码2(有explicit关键字)
2:static成员
2.1:概念
2.1.1:代码1(在类里面初始化)
2.1.2:代码2(在类外面初始化)
2.2:特性
2.2.1:特性1:静态成员为被所有对象所共享,不属于某一个具体的对象,静态成员被存储在静态区.
2.2.2:特性2:静态成员变量必须在类外面定义,定义时不添加static关键字,类中只是声明
2.2.3:特性3:类的静态成员可以使用类名::静态成员 或者 对象.静态成员来进行访问.
2.2.4:静态的成员函数没有隐藏的this指针,不能访问任何的非静态成员
2.2.5:静态的成员函数不能够调用非静态的成员函数
2.2.6:非静态的成员函数可以调用类的静态成员函数
2.2.7:静态成员也是类的成员,也受访问限定符的限制.
3:友元
3.1:友元函数
3.1.1:代码1
3.1.2:代码2(的正确重载方式)
3.1.2:代码3(重载成类的成员函数)
3.2:友元类
3.2.1:代码1(未进行友元声明)
3.2.2:代码2(进行友元声明)
3.2.3:特性
3.2.3.1:特性1:友元关系是单向的,不具有交换性.
3.2.3.2:特性2:友元关系不能传递
3.2.3.3:特性3:友元关系不能够继承
4.内部类
4.1:概念
4.2:特性
4.2.1:内部类可以定义在外部类的public,protected,private都是可以的.
4.2.2:内部类可以直接访问外部类的static成员,不需要外部类的对象/类名
4.2.3:sizeof(外部类) = 外部类,与内部类没有任何关系
4.2.3.1:代码1(无内部类)
4.2.3.2:代码2(有内部类)
4.2.4:内部类受到外部类类域的影响
5:匿名对象
6:拷贝对象时编译器的一些优化
6.1:代码1
6.2:代码2
6.3:代码3
6.4:代码4
6.5:代码5
1:再谈构造函数
在类和对象(中)呢,我们学习到了构造函数,这里博主带着uu们简单回顾下.
构造函数是一个特殊的成员函数,主要完成对象的初始化工作,构造函数虽然叫构造,但是构造的函数并不是开辟内存空间创建对象,而是完成的对象的初始化工作.并且有如下特征
- 函数名与类名相同.
- 无返回值.
- 对象实例化的时候,编译器会自动调用构造函数
- 构造函数可以对其进行函数重载(譬如拷贝构造函数).
- 当用户不写构造函数时,编译器会帮助我们生成一个默认的构造函数
- 无参构造函数,全缺省构造函数,编译器自动生成的构造函数即不需要用户去进行传参的构造函数都被称为默认的构造函数.
- 默认的构造函数对于内置类型不做处理,对于自定义类型会调用其对应的构造函数.
1.1:构造函数体赋值
在创建对象的时候,编译器通过调用构造函数,给对象中的各个成员变量一个合适的初始值.
我们来看下面这段代码
#define _CRT_SECURE_NO_WARNINGS #include using namespace std; class Date { public: Date(int year,int month,int day) { _year = year; _month = month; _day = day; } void Print() { cout