前言
整理代码思路,举一反三..
引入
前面写了一篇帖子代码集:当遇到传值受限的函数,应该如何编写-CSDN博客,讲了传入值被限制的时候如何编写函数,再深入一点分析函数的过程及补充返回值受限函数的编写.
概要
函数的原理分析以及实现,重点在某些受限函数的编写
函数原理
函数是由编程语言支持,用输入值-输出值表达逻辑的代码模块.假定有输出值和输出值,不考虑无输入值,无数据变化的函数,例如:
/*不考虑以下形式函数,无输入,无逻辑*/
void fun(){
std::cout<<"Hello"<<std::endl;
}
考虑以下函数:
/*有输入,有输出*/
/*伪代码*/
RetType fun(ParaType1 pt1,ParaType2 pt2){
statement; //语句1
statement; //语句2
return rt; //返回值
}
面向过程的函数
在面向过程的函数中,输入值的数据通道是形参列表,输出值的数据通道是形参列表和返回值类型.输入值代表逻辑中的"因",函数体内的数据变化表示"果".表示"果"的数据(输出值)可由返回值或者形参所获得.
举个例子:写个函数表示输出值等于输入值加2.
1.返回值接收输出值
int add_two(int original_data){
original_data+=2;
return original_data;
}
===============
int result=add_two(3); //调用函数后result值为5;
2.形参接收输出值(返回类型void)
void add_twop(int original_data,int * result) {
original_data += 2;
*result=original_data;
}
========================
int result;
add_twop(10,&result); //调用后result值12
注意:这种方法需要传入数据地址,即数据的指针常量,本例中用result接收结果,实参是&result
在上面两种写法的基础上,可以推导出面向过程的函数有多个输入(形参列表),和多个输出(形参列表和返回值)的写法,比如很典型的:需要告知函数执行结果,将bool类型作为返回值,其他返回值放到形参列表里.
bool add_twop(int original_data,int * result) {
original_data += 2;
*result=original_data;
if(*result>10)
return true;
return false;
}
=======================================
bool ret; //声明bool型变量ret
int result; //声明变量,接收函数计算结果
ret=add_twop(10,&result); //调用函数,返回结果
if(ret==true)
cout<<"计算后的结果大于10"<<endl;
else
cout<<"计算后的结果小于10"<<endl;
如果输入输出的值多了,很自然想到打包成结构体(C语言)--对象不在这个范围,因为更容易.
===========================内容分割线======================================
更新日常认知:过去没有返回值,认为返回值类型设为void即可,现在看来void设为返回值类型还可以从形参返回. 所以输入值可以没有,但输出值一定有(没有也当成有),可以由return返回,也可以由形参返回.
===========================内容分割线=====================================
输入值受到限制时
前面的帖子代码集:当遇到传值受限的函数,应该如何编写-CSDN博客说过, 当输入值受到限制时,返回值类型可以用void或者bool来写,伪代码如下(假设输出值由形参返回)
/*伪代码,bool作返回值类型,*/
/*不在范围内的传值不会处理,返回布尔值*/
bool fun(paraType1 pt1,retType * rt){
if(pt1在范围内){
statement;
return true; //true或false自己定义
}
return false; //true或false自己定义
}
====================================================
/*伪代码,void作返回值类型,*/
/*不在范围内的传值不会处理,直接return*/
void fun(paraType1 pt1,retType * rt){
if(pt1在范围内){
statement;
return; //处理数据并return
}
return; //不处理直接return
}
假如上面写法不习惯,输出值仍由return返回
/*伪代码,T作返回值类型,*/
/*不在范围内的传值不会处理,直接return*/
T fun(paraType1 pt1){
if(pt1在范围内){
statement;
return t1; //处理数据并return一个T类型值t1.
}
return t2; //不处理直接return一个T类型值t2,有辨识度
}
输出值受限制时
当输出值受到条件限制,使得输出值也受限时
/*伪代码,void作返回值类型,*/
/*不在范围内的传值不会处理*/
void fun(paraType1 pt1,retType * rt){
if(pt1在范围内)
*rt=t1; //输出值赋值t1
else
*rt=t2; //输出值赋值t2,有辨识度的
}
如果编写函数时"不小心"写成了输出值用return返回时,这时可能没有相应的值输出,或者输出一个上一个值,可以使用静态局部变量来实现
/*伪代码,T作返回值类型,*/
/*不在范围内的传值不会处理,return上一次取得的值*/
T fun(paraType1 pt1){
static T tmp; //声明静态变量
if(pt1在范围内){ //如果条件满足,进入这个分支
statement; //语句
tmp=t1; //return前记录下这个值
return t1; //正常情况下return一个T类型值t1.
}
return tmp; //如果再次调用函数,条件受限,则返回上一次的值
}
面向对象的函数
在类中定义的对象函数,因为可以使用类作用域内的数据,也就是可以调用其他对象函数和使用对象属性,所以"数据通道"要宽得多, 也就没有面向过程函数的那个限制:输入值的数据通道只有形参列表,输出值的数据通道有return和形参列表. 输入值和输出值直接和对象属性对接.这也是面向对象的一个优势吧
#include<iostream>
using namespace std;
class Demo {
int age;
public:
Demo(int ag):age(ag){}
int get_age() const{ return age; }
void fun() { //无参数,但可以使用任意属性
age++; //无返回值,但返回给属性
}
};
int main(void) {
Demo xz(30);
xz.fun();
int age = xz.get_age();
cout << "小张的年龄是:" << age<<endl;
}
小结
函数处理数据的一些应用