阶段小结

递归算法
程序直接或间接调用自身的编程技巧称为递归算法。
直接或间接调用自身的函数称为递归函数
它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

关键:
找出递归定义和递归终止条件

递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。
如n!=n*(n-1)!
递归终止条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。
1!=1

三个步骤:
1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。
2)设置边界、控制递归:找出停止条件。
3)设计函数、确定参数:设计函数体中的操作及相关参数。

标准库类型string
.标准库string类型 (头文件:#include 〈string〉)
1) getline()函数 (遇回车时结束)
在这里插入图片描述
2)size()函数返回String对象的长度
3)循环读入String对象 (键盘输入时,遇空格或回车结束)
在这里插入图片描述
4)字符串加 [ ],变成数组
for (size_t i = 0; i < s1.size(); ++i)
cout << s1[i] <<" ";

初始化string对象的方式
在这里插入图片描述
string的常用操作
在这里插入图片描述

C++数据类型
在这里插入图片描述

结构体:
C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;

};

结构体中可以定义函数:(此函数内定义变量,无需结构体变量名.成员名形式)
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;

} 变量名;

结构体的特点:
1)可以对结构体变量的整体进行操作。
例如:swap(a[i],a[j])
2)可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名
3)结构体变量的初始化方法与数组类似。

指针: 类型 指针变量; 指针保存指定类型的对象的地址,一个指针可以指向同类型的不同对象
指针存放指定类型对象的地址,要获取对象的地址,使用取地址运算符“&”
如果指针指向一个对象,则可以通过指针间接访该对象,使用指针解引用运算符“

空指针
指针值为0时是一个空指针,即不指向任何对象的指针
表示空指针的2种方法
0
预处理常量NULL

// 生成空指针的2种方法
int *p1 = 0;
int p2 = NULL;
void
指针
可以持有任何类型的地址值,即通用指针
new表达式的三种形式
分配单个对象:new 类型 或者 new 类型(初始值)
分配多个连续存储的对象:new 类型[数组大小]
定位new,在指定位置分配空间:new (指针) 类型;
delete
new运算符分配的空间用delete运算符释放
释放new分配的单个对象的delete形式
delete 指针;
释放new分配的数组的delete形式
delete[] 指针;
定位new没有对应的delete表达式

const限定指针
指向const对象的const指针
const type* const cp = initAddressValue;

引用
引用的定义和初始化
引用由类型标识符和一个说明符(&)来定义
type& refVariable = leftValue;
引用必须被初始化,初始值是一个有内存地址的对象
类型 &引用名 = 初始值;
引用是一个对象的别名,定义引用时必须用有内存地址的对象初始化
引用在初始化之后,一直指向该对象


类是对具有相同属性和行为的一类客观事物的概括描述。是用户自定义的数据类型(程序设计语言角度)
类的定义包括行为和属性两个部分
属性以数据表示,行为通过函数实现。
格式
class 类名
{
public:
公有数据成员和成员函数;
protected:
保护数据成员和成员函数;
private:
私有数据成员和成员函数;
};

各成员函数的实现;

构造函数是用于创建对象的特殊的成员函数
当创建对象时,系统自动调用构造函数
构造函数的作用是:
为对象分配空间;对数据成员赋初值;请求其他资源。
用户没有定义的构造函数时,系统自动提供缺省版本的构造函数
构造函数名与类名相同:类名
构造函数可以重载
构造函数可以有任意类型的参数,但没有返回类型

函数重载:函数名相同,但参数不相同(类型不同,或者个数不同)的一组函数。
编译器根据不同参数的类型和个数产生调用匹配
函数重载用于处理不同数据类型的类似任务

浅复制:
●在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。
即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容
●默认复制构造函数所进行的是简单数据复制,即浅复制
深复制:
●通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
●自定义复制构造函数所进行的复制是浅复制。

常成员
常数据成员是指数据成员在实例化被初始化后,其值不能改变。
在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数
常对象
类名 const 对象名[(参数表)];
或者
const 类名 对象名[(参数表)]
常成员函数
在类中使用关键字const说明的函数为常成员函数,常成员函数的说明格式如下:
类型说明符 函数名(参数表) const;
const是函数类型的一个组成部分,因此在函数的实现部分也要带关键字const。
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数(静态成员函数、构造函数除外)

友元函数
如果在本类(类A)以外的其他地方定义了一个函数(函数B)
这个函数可以是不属于任何类的非成员函数,
也可以是其他类的成员函数,
在类体中用friend对其(函数B)进行声明,此函数就称为本类(类A)的友元函数。
友元函数(函数B)可以访问这个类(类A)中的私有成员
友元类的声明格式:友元类的声明格式:

运算符重载
运算符函数可以重载为成员函数或友元函数
1.一元运算符 Object op 或 op Object
重载为成员函数,解释为:
Object . operator op ()
操作数由对象Object通过this指针隐含传递
重载为友元函数,解释为:
operator op (Object)
操作数由参数表的参数Object提供
2.二元运算符 ObjectL op ObjectR
重载为成员函数,解释为:
ObjectL . operator op ( ObjectR )
左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递
重载为友元函数,解释为:
operator op ( ObjectL, ObjectR )
左右操作数都由参数传递

用成员函数重载运算符
成员运算符函数的原型在类的内部声明格式如下:
class X {
//…
返回类型 operator运算符(形参表);
//…
}
在类外定义成员运算符函数的格式如下:
返回类型 X::operator运算符(形参表)
{
函数体
}

用友元函数重载
友元函数重载运算符常用于运算符的左右操作数类型不同的情况
在第一个参数需要隐式转换的情形下,使用友元函数重载运算符是正确的选择
友元函数没有 this 指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换
C++中不能用友元函数重载的运算符有
= () [] ->

重载运算符[]和()
运算符 [] 和 () 是二元运算符
[] 和 () 只能用成员函数重载,不能用友元函数重载
重载下标运算符 []
[] 运算符用于访问数据对象的元素
重载格式 类型 类 :: operator[] ( 类型 ) ;

设 x 是类 X 的一个对象,则表达式
x [ y ]
可被解释为
x . operator [ ] ( y )
重载函数调用符 ()
() 运算符用于函数调用
重载格式 类型 类 :: operator() ( 参数表 ) ;

设 x 是类 X 的一个对象,则表达式
x ( arg1, arg2, … )
可被解释为
x . operator () (arg1, arg2, … )

重载流插入和流提取运算符
istream 和 ostream 是 C++ 的预定义流类
cin 是 istream 的对象,cout 是 ostream 的对象
运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型

重载输出运算符“<<”(只能被重载成友元函数,不能重载成成员函数)
重载输入运算符“>>” (只能被重载成友元函数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值