文章目录
面向对象的基本概念
1.类
一些具有共性的事物,把共性集合在一起抽象出来的概念。
数据 + 行为。数据用来描述对象的性质,状态。行为描述对象的行为。
2.对象
抽象的概念它实体的反馈
是类的实体,这个实体将拥有具体的数据,能够执行具体的行为
3.对象和类
类是创建对象的模板,有了一个类以后,就可以创建这个类的对象,然后操作对象
4.接口、实现和消息传递
• 类的接口由对外公开的操作和属性构成。它规定了我们能向特定的对象发出什么请求。
• 类的实现主要由操作代码构成。
• 向对象发出请求让它执行某个操作或询问对象本身的状态,称为向对象发送消息。
5.信息隐藏和实现隐藏
信息隐藏:从外部看不到对象内部信息
实现隐藏:从外部看不到内部的实现步骤
所以提高了安全性
6.继承
继承允许在已有类的基础上定义新类(派生类),
派生类自动拥有已有类(基类)的属性和操作;
派生类可以增加自己特有的功能,也可以修改继承得到的功能(覆盖)。
软件重用思想
7.多态性
类的多态性是指在一般类中定义的属性或行为,被特殊类
继承之后,可以具有不同的数据类型或表现出不同的行为。
静态多态:通过函数重载、运算符重载或模板实现。
动态多态:通过类的继承关系和虚函数机制实现。
类和对象的定义和使用
1.类和对象的定义和引用
类的定义一般包括两个部分:声明部分和实现部分。
class <类名>
{
public: <数据成员或成员函数的声明>
protected: <数据成员或成员函数的声明>
private: <数据成员或成员函数的声明>
};
• 类的实现主要是指类的成员函数的定义;
• 类的成员函数定义可在类体外进行,也可在类体内进行;
• 类定义中声明的数据成员和成员函数都具有类作用域;
• 在类体外定义成员函数时,需用类名加域运算符“::”进行限定;~
例如:
下面是把display的定义写在类外面,但必须在类内声明并且在类外使用域运算符
2.构造函数
刚刚举例的代码里有个毛病
我们发现渣男没有被初始化,可以由客户程序员
去定义一个函数去初始化,但是很麻烦,
所以类有构造函数
构造函数在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。
构造函数是类中一个特殊的成员函数,其语法形式为:
ClassName(<形参表>)
{ ...
}
或者
ClassName::ClassName(<形参表>)
{ ...
}
举例
构造函数特点
① 构造函数的函数名必须与类名相同
② 不能指定构造函数返回值的类型
③ 构造函数可以重载
④ 构造函数由系统调用
⑤ 构造函数一般是公有的或保护的成员函数
⑥ 若没有定义构造函数,系统会提供一个默认构造函数
3.类和对象的定义和引用
对象成员的引用:
一种方法:
对象名. 成员名
另一种方法:
指针变量->成员名
4.常数据成员
• 在类中用const限定的数据成员为常数据成员;
• 常数据成员只能在构造函数的初始化列表中初始化;
• const数据成员的值在对象的整个生命周期中都不会发生变化。
5.函数成员
• 将一个成员函数的声明用const进行限制,能保证对象 的常量性;
• 常对象不能调用无const修饰的成员函数。
• 常对象可以调用其 const成员函数。
• 成员函数的实现部分也要带有const关键字。
非常对象可以调用其 const成员函数。
常成员函数的实现部分也要带有const关键字。
6.友元函数
友元函数不是类的组成部分,但必须在被访问的类内说明,
一般在类外定义,一般格式为
friend <类型名> 友元函数名(形参表);
注意:
友元函数的说明可以出现在类的任何地方
友元函数可以访问该类中的所有成员
友元关系不具有交换性和传递性
应谨慎使用友元函数
类的继承
继承和派生
1.保持已有类的特性而构造新类的过程称为继承,在已有类的基础上新增自己的特性而产生新类的过程称为派生。
2.基类(父类)和派生类 ( 子类 能够派生出其它类的类称为基类(父类),从基类派生出的新类称为派生类(子类)
3.单一继承和多重继承 当一个类仅由一个基类派生时,称为单一继承;当 一个类由多于一个基类派生时,称为多重继承
C++访问控制权限
公有继承
1.基类的所有成员在派生类中保持各个成员的访问权限不变;
2.派生类中的成员函数可以直接访问基类中的public和 protected成员,但不能直接访问基类的private成员;
3.公有派生类继承了基类的接口,能够发送给基类对象的消息派生类对象也可以接收
class A
{
int x;//不写访问权限默认是私有
protected:
int y;
public:
int z;
A(int a, int b, int c) {
x = a; y = b; z = c;
}
int Getx() {
return x;
}
int Gety() {
return y;
}
void ShowA() {
cout << x <<" " << y << " " << z << endl;
}
};
class B :public A
{
int Length, Width;
public:
B(int a, int b, int c, int d, int e) :A(a, b, c) {
Length = d; Width = e;
}
void ShowB() {
cout << Length << " " << Width<< endl;
cout << Getx() << " " << y <<" " << z << endl;
}
int Sum() {
return (Getx() + y + z + Length + Width);
}
};
int main(void) {
B b1(1, 2, 3, 4, 5);
b1.ShowA();
b1.ShowB();
cout << "Sum=" << b1.Sum() << endl;
cout << "y=" << b1.Gety() << endl;
cout << "z=" << b1.z << endl;
return 0;
}
私有继承
保护继承
派生类对象的创建和撤销
赋值兼容规则
例子:
派生类对基类的修改
多重继承