面向对象方法概述
首先,它将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能对本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
对象
面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构造系统的一个基本单位。对象由一组属性和一组行为构成。
类
把众多的事物归纳,划分成一些类。是人类在认识客观世界时常采用的思维方法;分类依据的原则是抽象。面向对象方法中的“类”是具有相同属性和服务的一组对象的集合。一个属于某类的对象称为该类的实例。
封装
封装是面向对象方法中一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。
继承
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。其对于软件复用具有重要意义。
多态性
多态性指在一般类中定义的属性或行为,在被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一属性或行为在一般类及及其各个特殊类中具有不同的语义。
面向对象软件开发流程
内联函数
对于一些功能简单、规模较小又使用频繁的函数,常将其设计成内联函数,内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,增加代码的重用性。
其定义与普通函数定义方式几乎一样,只是需要使用关键字inline
.
int add(int a, int b) // 普通函数定义
{}
inline int add(int a, int b) // 内联函数定义
{}
带默认形参值的函数
函数在定义时可以预先声明默认的形参值。调用时如果给出实参,则用实参初始化形参,如果没有给出实参,则采用预先声明的默认形参值。如
int add(int x = 5, y = 6)
{
return x+y;
}
如果只有部分参数有默认形参值,则有默认形参值的变量必须在无默认形参值变量的前面!
int add(int x, int y = 5, int z = 6); // 正确
int add(int x = 1, int y = 5, int z); // 错误
int add(int x = 1, int y, int z = 6); // 错误
warning :如果一个函数在定义之前又有原型声明,默认形参值需要在原型声明中给出,定义中不能再出现默认形参值。
int add(int x = 5, int y = 6);
......(omit some code)
int add(int x/*=5*/, int y/*=6*/)
{
return x+y;
}
函数重载
C++ 允许功能相近的函数在相同的作用域内以相同函数名定义,从而形成重载。方便使用,便于记忆。
重载函数的形参必须不同:个数不同或类型不同。编译程序对实参和形参的类型和个数进行最佳匹配,来选择调用哪个函数。
int add(int x, int y);
float add(float x, float y);
int add(int x, int y);
int add(int x, int y, int z);
类与对象
面向对象设计的基本特点:抽象
,封装
,继承
,多态
。
- 多态
- 强制多态(数据类型转换)
- 重载多态
- 类型参数化多态(模板)
- 包含多态(虚函数实现)
const 修饰成员函数的两种情况
- const在函数
后面
void print() const;
表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变,并且对于常对象而言,其只能调用“这种形式”的常成员函数。在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const
,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的,const 限制的是 this 指针!。
- const 在函数
前面
const int print() const;
这表示函数的返回值为 const 类型。
C++对象动态建立与静态建立的区别
见
刨根问底
-
为什么复制构造函数的参数必须要用引用类型来传递?
在函数调用过程中,具有非引用类型的参数必须要进行拷贝初始化。类似的,当一个函数具有非引用的返回类型时,返回值会被用来初始化调用方的结果。
而复制构造函数被用来初始化非引用类类型参数,这一特性决定了复制构造函数的参数必须是引用类型。如果其参数不是引用类型,则调用永远不会成功(为了调用复制构造函数,必须要拷贝它的实参,但拷贝实参又必须要调用复制构造函数,因而陷入无限循环)。