【1】C++基础系列

算法笔试过不了,回来补补C++

******************2018-9-17****************

1、auto类型和decltype类型

auto:编译器通过初始值自动推断变量类型。如auto val = val1 + val2

decltype:定义变量与某一表达式类型相同,但不使用该表达式初始化变量

例如:decltype(i)j=2

表示 j 以2作为初始值,但 j 的类型和 i 一样。

2、i++和++i

i++ :先引用后增加,++i :先自增再引用。

                                                          

3、do while{……}先执行do内的一次循环,然后判断while内的条件是否依然成立,如果成立,继续循环,否则跳出循环执行后面的语句。和只有while的循环的差别在于是否至少执行了一次循环。

循环次数不确定是使用while循环。比如统计正整数和负整数的个数。

4、for(初始语句;表达式1;表达式2)先执行初始语句,如果表达式1成立,执行循环体内容,每次执行完循环体内容后,求解表达式2的值。

5、计算图形面积

                                                  

6、声明一个表示时间的结构体。可以精确的表示年,月,日,小时,分,秒;提示用户输入年、月、日、小时、分、秒的值,然后完整的输出

                                

7、函数:内联函数,函数的开销(时间和空间),函数调用转子函数返回,constexpr函数(常量表达式函数),

函数定义的语法形式:

                                                       

形式参数表:如<type1> name1,<type2>name2,<type3>name3被初始化的内部变量,寿命和可见性仅限函数内部。

函数的返回值类型和函数的类型一致。无类型无返回的函数为void,不必写return语句。

8、函数调用大纲

函数在调用前必须要先做函数的原型声明:类型标识符 被调用函数名(含类型说明的形参表)。

调用时是使用形式:函数名(实参列表)。

函数定义:类型标识符函数名(形式参数表){语句序列}。

函数调用时,实参会初始化形参,这个时候为形参分配存储空间

函数可以嵌套和递归。

求x的n次方:

                                              

求圆周率pi:

                                                    

回文数:

                                   

sin函数:

                                             

9、递归:递推和回归

阶乘:

                                                    

用递归法计算从n个人中选k个人组成一个委员会的不同组合数:

                                             

汉诺塔:

                                           

10、函数的参数传递:单项传递,双向传递,数据的安全性。

函数只有在被调用时才会为形参分配存储单元;实参可以是常量、变量、表达式;实参类型必须含形参类型一致(如果不一致,可能或有隐含转换数值类型或者报错);值传递是传递参数值,即单项传递;引用传递可以实现双向传递;传引用作参数可以保证实参数据的安全。

传引用的开销比传值要小。有事需要传引用但是又不希望双向传递,就需要解决传引用时的安全问题。

11、引用类型

引用(&)是标识符的别名。例如:int i,j;

int &ri = i;//定义int引用ri,并初始化为变量i的值。ri相当于是i的另外一个名字

定义一个引用时,必须同时对他进行初始化,使他指向一个已经存在的对象或者变量。不允许悬而未决!

这时,假如:j=10;ri=j;赋值给ri的时候就相当于把10赋值给了i。

一旦一个引用被初始化之后,就不能改为指向其他对象。

引用可以作形参。实现双向传递

例子:两个数交换

第一幅图没有使用引用,交换不成功。因为a,b和x,y的联系,实参初始化形参完成之后就不存在了:这一步实在主函数中完成的,而交换是在子函数中,作用于已经变了,a,b交换之后程序回到主函数中,此时a和b已经不存在,所以输出仍然是x和y的值。

第二幅图:使用了引用,分别有(x,a)作为x的别名和(b,y)作为y的别名,所以a,b交换也意味着x,y交换。

12、可变长度的形参表,含有可变参数的函数

C++提供了两种主要的方法:

如果所有实参类型相同,可以传递一个,名为initializer_list的标准库类型。

如果实参类型不同,我们可以编写可变参数的模板(后续会见到)

initializer_list是一种标准库类型,用于表示某种特定类型的值的数组,该类型定义在同名的头文件中。#include "initializer_list.h"

initializer_list对象中的元素永远数常量值,我们无法改变initializer_list对象中的值

用法:initializer_list<string> ls;initializer_list<int> i;等形式。含有initializer_list形参的函数也可以同时拥有其他形参。

使用举例:比如编写代码输出程序产生的错误信息时最好能用一个统一的函数实现该功能,是的对所有的错误信息处理能够整齐划一,然而错误信息的种类不同,调用错误信息输出函数是传递的参数也会各有不同。

使用initializer_list编写一个错误输出函数使其可以作用于可变数量的形参。

13、内联函数inline:使调用简单函数时提高运行效率。高级的编译器都有自己的代码优化部分,所以inline不一定需要。

14、constexpr函数

语法规定:constexpr函数修饰的函数,在其所有参数都是constexpr时一定返回constexpr。(不重要)

15、默认参数值的函数例子

计算长方体:

                            

猜你喜欢

转载自blog.csdn.net/qq_21210467/article/details/82733403