C++之函数提高(HM)

发布于:2024-04-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

1.函数默认参数(缺省参数)

2.占位参数

3.函数重载

4.类和对象--封装

(1)圆类:

(2)访问权限

(3)struct&&class

(4)立方体类的设计案例

(5)点和圆的关系设计案例

(6)设计案例分文件处理

(1)test.cpp文件

(2)point.h文件

(3)point.cpp文件

(4)circle.h文件

(5)circle.cpp文件

5.对象的初始化和清理

(1)构造函数和析构函数

(2)默认构造&&自定义构造&&拷贝构造


1.函数默认参数(缺省参数)

(1)这个就是我们常见的参数的传递过程,函数定义的时候定义变量作为形参接受传递过来的参数,这里返回的是三个数字的和;我们传递参数是10,20,30,在主函数里面进行设置;

(2)我们还可以使用函数的默认参数,如图所示,我们定义函数的时候进行设置默认的参数,我们在主函数里面只传递一个参数,其他的两个是默认的参数,同样可以实现我们的目的;

(3)两个注意事项

1.如果我们定义的函数的某一个位置,有了一个默认的参数,那么从这个位置开始(从左向右)其后面的形参都必须要有默认值);

2.我们都知道函数是可以先定义后使用的,如果我们先使用,就要在主函数的前面加上函数的声明,对于函数的声明和函数的定义,两者只能够有其中的一个设置默认值,也就是说如果声明时候设置默认的参数,定义的时候就不能重复的进行默认参数的设置(因为这样就会产生歧义,编译器不知道使用哪个默认的参数);

2.占位参数

现阶段我们只需要知道占位参数的用法,后续会使用到;

占位参数的默认值:

3.函数重载

函数名相同,函数的参数类型,个数,顺序不同,提高函数的复用性:

(1)一个拥有参数,一个没有参数,构成函数的重载


(2)函数的参数个数相同,但是参数的类型不同:


(3)含有缺省参数的情况:


(4)函数重载和引用的结合:

我们创建函数的重载,这两个参数一个带有const修饰,一个没有const修饰,这个是可以构成函数的重载的,但是两个只会打印222;

          int &b=10;这个是不合法的

const int &b=10;这个是合法的;

我们传递变量的名字,就可以执行int &b就可以执行了;


4.类和对象--封装

(1)圆类:

使用class创建类,我们计算圆的周长,类里面就要设置变量r作为半径,定义函数求出圆的周长;

实例化对象操作:通过类,创建对象c1,调用我们的自定义函数求出指定对象的周长;

我们把半径的设置可以使用类里面的方法来完成(就是一个函数):

使用rr形参接收实参,设置半径的值,类里面的方法实质就是函数;

(2)访问权限

public&&protected&&private分别代表的是公开的,受保护的,私有的成员变量;

公开的在类的里面可以访问,类的外面也是可以访问的;

protected&&private都是类里面可以访问,外面不可访问;

(3)struct&&class

struct默认权限是公共,类的外面可以访问;

class默认权限是私有,类的外面不可以访问;

(4)立方体类的设计案例

tip:1.全局函数和成员函数的使用异同;2.全局函数传进去两个参数,成员函数传进去1个参数

3.传进去一个参数就是比较已知的参数和自己的,这个里面已知的就是c2对象,自己的(主函数里面的自己)就是c1,因为我们是使用c1.issame2()进行调用成员函数的,所以长宽高就是c1对象的;

4.使用引用不需要额外开辟新的空间  5.bool的返回值就是true或者是false进行判断

(5)点和圆的关系设计案例

在类中,可以让另外的一个类作为本类的成员;

(6)设计案例分文件处理

我们可以把不同的类放到不同的文件里面去:

(1)test.cpp文件

(2)point.h文件

先复制原来的point类的代码,把函数的实现全部去掉,变为函数的声明;

(3)point.cpp文件

先复制原来的point类的代码,只保留函数的实现,其余的全部去掉;包含对应的头文件;

(4)circle.h文件

因为圆类里面有点类,所以需要包含点类的头文件;还是把函数的实现变为函数的声明;

(5)circle.cpp文件

函数的实现,其余的全部去掉(主要含是原来的代码);

备注:上面的point,circle类的函数的实现都要使用类名::函数名,这样表明作用域,否则会报错

5.对象的初始化和清理

(1)构造函数和析构函数

构造函数和析构函数就算我们自己不去写,编译器也会自动是实现,只不过编译器实现的时候,两个函数里面都是空语句,我们自己实现的时候,可以在函数里面加上一些内容,这样就可以把这两个函数的执行过程显示出来;

构造函数再对象创建的时候执行,析构函数再对象销毁的时候执行,构造函数里面可以有参数,支持函数的重载,但是析构函数不能够有参数,且不支持函数的重载;两个都没有返回值,而且不能写为void;

上面的代码我们把student类的对象放在了test函数里面创建,相当于是一个局部变量,test函数执行完成以后就会销毁,这个销毁同时就会执行析构函数;

(2)默认构造&&自定义构造&&拷贝构造

函数的调用有3种方法:括号法,显示法,隐式转换法

默认构造函数在调用的时候不能加括号,举个例子,这个里面我们嗲奥永的时候只需要写

person p1,不能在p1的后面加上小括号,因为加上后就会被编译器理解为函数的声明,我们的函数的声明不就是例如:void test()这样的声明,加上括号的货就会被理解为函数的声明,所以不能加小括号;

拷贝构造函数,参数是const 类的名字(对象),我们加上const是不能修改我原来的对像的属性,相当于是把参数里面的对象的属性全部拷贝到我们当前的对象上面去,谁调用谁就是当前的对象,我们这里的是person p3(p2),就是把p2对象的属性拷贝到当前对象p3上面去,参数要使用引用,这个就是拷贝构造函数的格式。


网站公告

今日签到

点亮在社区的每一天
去签到