Object Oriented Programming

Objects — attributes and methods

  • #pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次,防止头文件被重复引用
notion image
notion image

Cosntructor and Distructor 构造和析构函数

  • Constructor函数由编译器保证执行,一般用于成员属性的初始化
  • 构造和析构的调用是自动的,由程序编译器本身来执行,程序员只要保证构造和析构的内容是正确的
  1. default constructor 无参数默认被执行的构造函数
  1. 特殊的构造函数,可以加上参数,这样有初始化赋值的时候,就会执行特殊的构造函数
Eg:

Constructor: Initializer list

EG:
其中,位于Point函数冒号后面的:x(xx),y(yy),id(idd)就是该构造函数的初始化列表
  • 并且,如果成员函数是const,只能通过在初始化列表里面初始化,不能在构造函数的代码段来赋值初始化
notion image
alt text
  • 如果要用于数组的长度初始化,必须加上static使其具有全局静态性

对象的this指针

  • this指向对象的地址,通过this指针可以访问对象的成员属性和成员函数
EG:

Const objects 常对象

  • 常对象不能修改成员属性
  • 则成员函数后面,如果不能修改成员属性,则需要加上const修饰符,表示该成员函数不能修改成员属性 > (并且如果加了const该函数还能改变成员属性,编译器会自动报错)

Protected

protected和private的区别:
  • public提供了最大的访问权限,使得任何类或对象都可以访问该成员;
  • private提供了最小的访问权限,只有类自己可以访问该成员;
  • protected则提供了一种介于两者之间的访问权限,只允许类自己和它的子类访问该成员
    • notion image

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

继承的三种限定名

notion image
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”
输出的证明:
最后的输出结果:

第二种:

或者也可以在实现里面用
输出也为
但是强烈推荐使用第二种方法
 
Loading...