面相对象的方法的目的:解决软件产业化问题
对象之间通过消息来通讯
抽象(数据抽象<int Hour>、代码抽象<SetTime( )>)—具体
类可以实现数据的封装、隐蔽、继承和派生
类包含:属性和行为
对象是类的实体
内联成员函数 关键词inline/直接在class内实现à适用于功能较为简单的成员函数 示例如下↓
Class A
{
Public: int GetElemtX ()
{return x;}
}
Inline int A :: GetElemtY()
{ return y; }
初始化 ≠ 赋值 初始化à构造函数
拷贝构造函数
类名 (类名 &对象名) { } //参数必须是本类对象的引用 不需要拷贝对象副本
拷贝构造函数会自动生成 à 自动做对应数据的意义复制
Point :: Point (Point &p)
{ X=p.x; Y=p.y; }
调用 : Point B = A;
结构体与类的区别:结构体默认为public、类默认为private
联合体 union 所有元素共用一段内存(同一时间段只存在一个数据)
作用域:对象可用的范围 / 不可用≠消失 à生存期
作用域:函数原型作用域 à 参数表”( )”内部
定义重载函数时,变量名不作为重载的因素
局部作用域 à { }内部
类作用域 à X.m / X::m / Pt->m
文件作用域 起始于定义位置,终止于文件结尾(全局变量)
一般内存能够访问外层变量,除非内层中如果有同名的变量会屏蔽外层变量(使用 :: 依旧可以访问)
生存期:
静态生存期 à 与文件生存期一致(全局变量/static变量)
无对象的时候可以通过对象名调用static成员(函数/对象)à Point::ShowCount();
动态生存期 à 起始于定义,终止于命名作用域结束
类之间的数据共享: 类的静态成员(数据成员&成员函数)<公有成员>
友元<私有成员>
友元: 对数据封装和隐藏机制的破坏à提升效率,威胁数据安全
友元函数:friend float Dist(Piont &a,Piont &b);
友元类 Class A
{
Friend class B;
Private: int x;
}
Class B
{
Public: void Set(int i);
Private: A a;
}
Void B::Set(int i)
{ a.x=i; }
共享数据的保护:常对象 const 类名 对象名 必须进行初始化,且不能被更新
常引用 const 类型说明符 &引用名 被引用数据不能更新
常数组 const 数组名[大小] 数据元素不能被更改
常指针 暂无 指向的对象不能通过指针修改 Pt->X=12;(错误)
只有常函数能调用常对象 void Print () const
Const R b(10,20); b.print();//调用void print() const
Const 数据成员: 非静态 只能在外部赋值 const int A::b=10;
静态 A::A(int i) : a(i) { } 只能在构造列表中赋值,不允许放到“{ }”中
继承与派生
继承的目的:实现代码的重用
派生的目的:对原有程序的改造
一个派生类有多个基类称为多继承,直接基类、间接基类。私有成员会被继承,只有构造、析构函数不会被继承。私有成员无法被直接访问(本类成员函数、友元才能访问)
示例:
组合>单继承>多继承
派生的过程:1.吸收基类成员 2.改造基类成员(如同名屏蔽) 3.添加新成员
类型兼容:
public派生对象在使用上可以被当作基类。表现在:派生类的对象可以以隐含转换为基类对象、可以初始化基类的引用、派生类指针可以隐含转换为基类指针。à通过基类对象名、指针只能访问被继承的成员
未使用虚函数 使用虚函数
!不要定义继承来的非虚函数
多继承: class 派生类名: 继承方式1 基类名1, 继承方式2 基类名2…
构造基类:调用基类构造函数
一般构造A->B->C 多继承构造(class C:public B, public A)
继承拷贝构造函数:直接将参数赋值给基类拷贝构造函数(向上转型:派生类对象可以作为基类对象使用) C::C(const C &c1):B(c1){ … }
虚基类(所有派生类都要负责给最远基类传递参数)和虚函数可以解决多继承带来的二义性问题