Object Oriented Programming
Objects — attributes and methods
#pragma once
是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次,防止头文件被重复引用
Cosntructor and Distructor 构造和析构函数
- Constructor函数由编译器保证执行,一般用于成员属性的初始化
- 构造和析构的调用是自动的,由程序编译器本身来执行,程序员只要保证构造和析构的内容是正确的
- default constructor 无参数默认被执行的构造函数
- 特殊的构造函数,可以加上参数,这样有初始化赋值的时候,就会执行特殊的构造函数
Eg:
Constructor: Initializer list
EG:
其中,位于Point函数冒号后面的:
x(xx),y(yy),id(idd)
就是该构造函数的初始化列表- 并且,如果成员函数是
const
,只能通过在初始化列表里面初始化,不能在构造函数的代码段来赋值初始化
alt text
- 如果要用于数组的长度初始化,必须加上
static
使其具有全局静态性
对象的this
指针
- this指向对象的地址,通过this指针可以访问对象的成员属性和成员函数
EG:
Const objects 常对象
- 常对象不能修改成员属性
- 则成员函数后面,如果不能修改成员属性,则需要加上
const
修饰符,表示该成员函数不能修改成员属性 > (并且如果加了const
该函数还能改变成员属性,编译器会自动报错)
Protected
protected和private的区别:
- public提供了最大的访问权限,使得任何类或对象都可以访问该成员;
- private提供了最小的访问权限,只有类自己可以访问该成员;
- protected则提供了一种介于两者之间的访问权限,只允许类自己和它的子类访问该成员
Derived 和 Base 以及嵌套的类—初始化
最后输出结果:
顺序:
- LIFO:基类,组合类,自己
重名函数的继承
- 如果Derived类中重名函数,则编译器会优先选择Derived类中的函数,而不是Base类中的函数;从Base下继承下来的重名函数将无法直接访问,必须要加限定名。
- 比如如果我在Derived类中也写一个他自己的print函数,那么加限定名—
d.Base::print()
—才能访问d从Base里继承下来的print函数,否则d.print默认访问Derived类中的print函数
只要我的子类Derived Class里面定义了一个同名函数,那么不管Base类中的同名函数的参数表是否一致、是否有过重载,Base类中的同名函数都会发生NameHiding,也就是不能直接调用,必须添加 Base::来限定
- Name Hiding 派生类里面的重名函数会把基类里面的重名函数都隐藏掉,只要重名,无关参数表
Friend 声明
- friend声明,让某个
东西
可以直接访问该类的私有成员
可以 friend 声明的有 全局函数,其他类的成员函数,其他类
class vs struct
- class默认都是private,struct默认都是public
Accent Protection
继承的三种限定名
alt text
- 私有成员的访问控制其实是对类而言:
- 只要是允许的类就可以(访问private)
继承类的ctor初始化
对于下面这个程序:
如果我的normal的初始化是:
只有写成:
第一种:
- Derived类自己初始化的时候,其实是先初始化一个Base基类的对象,然后将这个对象的东西搬一份到自己要初始化的对象身上,如果在初始化基类的时候,自定义参数,比如:room(“normal”);那么这个normal对象里面的room对象的Room_Type就是”normal”, 而normal类对象的Room_Type又是从room对象里面复制来的,所以normal对象的Room_Type也会初始化成”normal”
room("normal")normal::Room_Type = room::Room_Type 所以:normal::Room_Type 和 room::Room_Type都为”normal”
输出的证明:
最后的输出结果:
第二种:
或者也可以在实现里面用
输出也为
但是强烈推荐使用第二种方法