函数设计中存在的一些问题

原创 2012年03月31日 14:56:46

对函数传入,是指用实参将外部数据传给函数,以便于在函数体内对其处理。

对函数传出,是指用返回值将函数处理的结果交给主调函数。

 

设计函数时要考虑到:

1、函数是否担负修改实参的任务?

2、传入实参是否会影响效率?

3、形参是否还要承担向调用者传递部分结果的任务?

 

关注函数的返回值:

当它是变量或对象时,一切OK。因为返回值是局部变量的复制品。但若返回值是地址或引用,则要引起足够的警惕。关注:

1、这个地址是局部变量的吗?

2、这个地址是由函数malloc()或new产生的?

3、这个地址是形参传进来的吗?

4、是全局变量的地址吗?

5、是静态变量的地址吗?

 

若是4或5,则无事;若是1,则错了!若是2,则要追踪其何时释放;若是3,则要看形参自身是指针,则可以,若形参不是指针,则错。

 

函数返回的可以是:

1、变量的值(无论局部还是全局);

2、静态局部变量的值或址;

3、静态局部数组的址;

4、全局变量的值或址;

5、全局数组的址;

6、堆空间的地址;

 

注意:函数返回类型是指针时的模糊性

       函数的返回类型可以是指针。比如,用于在数组中查找某值的函数,通常做成“当查到时,返回指向该元素的指针;查不到时,返回NULL指针。”

       这种“用一个值表示两种不同含义”的做法很危险。因为它加重了使用函数者的负担。若查找的元素的值就是NULL怎么办?

       好的设计是让函数的返回只担负一个职责:是否找到。将查找到的元素地址用函数的形参指针传递。

 

一些结论:

1、函数调用只能用于非静态局部变量的初始化。

2、静态变量作形参,失去了静态性

 

子函数的构造原则:

一个函数应具有的强壮性体现在两个方面:

1、对传来的实参不能无条件地接受,要进行合法性验证,不要基于“实参都是对的”的懒惰惯性思维,要学会拒绝;

2、函数体内的处理过程也要时时进行合理性检查,要由容错处理(异常处理)机制,一旦有错不但会报警,还要有全身而退的对策。因为程序是在有限资源的空间上运行的。

 

通常由三种处理方法:

1)最极端的做法就是用exit(-1)函数,粗暴的终止程序,这无异于谋杀;

2)用抛掷异常的现代手段;

3)让子函数温和地停止,并返回一个真假值,此法能使程序不致夭折,将决定权交由调用者酌情处理。此谓全身而退策略。

 

函数指针的意义:

1、历史的原因,函数类型不能做参数,语言将自动将转换为函数指针。

2、通过函数指针可以使C++语言使用其他语言写就的函数。

3、通过函数指针参数尅使主调函数得到不同的被传入的函数,于是可以表现出多种行为。

4、函数指针使虚函数得以实现。

5、通过函数指针可以括约本地进程,访问其他进程。

6、函数指针使函数设计更加变幻莫测,会偏离函数的黑盒性。

7、函数可以定义引用。

 

函数指针有它的一个致命的缺点:

        无法对参数和返回值的类型进行检查,因为函数已经退化成指针,指针是不带有这些类型信息的。少了类型检查,当参数或者返回值不一致时,会造成严重的错误。

 

 

[数据库]关于设计表时应该注意的问题

如有错误欢迎大家指出。这段时间在家里,做了点修正。 1、慎重选择表名。 有两种选择: 按照多数开发语言的命名规则。比如(myCustomer)。 按照多数开源思想命名规则。比如(my_cust...
  • SunnyYoona
  • SunnyYoona
  • 2014年05月19日 10:25
  • 1467

高性能软件系统设计中应该考虑的问题

高性能软件系统设计中应该考虑的问题   高性能软件系统都是应用于大用户量,超大数据量处理的情况下,这样的软件系统并不好设计,这里主要讲述一下对于高性能软件系统在设计过程中要注意考虑哪些问题。  ...
  • love_everyday
  • love_everyday
  • 2014年12月02日 14:06
  • 1701

C/C++笔试题(很多)

微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥...
  • weiyuefei
  • weiyuefei
  • 2016年08月29日 11:47
  • 14213

apache在mac上以及linux上安装存在的一些问题以及解决方法

  • 2016年03月06日 00:37
  • 698KB
  • 下载

电路系统设计制作过程和需要注意的一些问题

电子电路设计涉及的东西很多。首先是你需要根据具体的需要和应用去设计电路图。这是整个设计中最重要的一个环节。这个环节你需要考虑的问题很多。就拿数据采集系统来说。      首先:最先想的的肯定是你需要...
  • xqmoo8
  • xqmoo8
  • 2012年02月22日 14:46
  • 751

关于之前的博客《SharePoint无代码工作流设计开发实例——交通费报销流程(三) 》的一些问题的解答

关于之前的博客《SharePoint无代码工作流设计开发实例——交通费报销流程(三) 》的一些问题的解答 《SharePoint无代码工作流设计开发实例——交通费报销流程(三) 》这篇博客已经写了...
  • miragesky2049
  • miragesky2049
  • 2014年01月22日 18:11
  • 5169

邮件模板中css和html设计的一些问题

--文章转载自http://blog.wumashi.com/archives/387 邮件模板,请严格按照下面的规则执行。邮件客户端和Web页面的需求不同,在编写代码的时候,考虑的方向也不...
  • sad_orc
  • sad_orc
  • 2014年02月20日 15:48
  • 506

函数返回类型为指针类型时的一些问题

1.先看程序:#includechar  *returnStr(){           char  *p = “tigerjibo”;           return  p;}int  main(...
  • tigerjb
  • tigerjb
  • 2012年04月04日 14:43
  • 12600

C++中数组以及多维数组作为函数参数时的一些问题

output1(ia, sizeof(ia)/ sizeof(ia[0])); 今天在做《c++ primer》上的习题的时候,遇到了一个小问题。 原始函数如下: void output...
  • King_DJF
  • King_DJF
  • 2016年10月13日 21:15
  • 650

浅议C编程中遇到scanf函数的一些问题

scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序:...
  • XR1064
  • XR1064
  • 2014年06月08日 17:44
  • 718
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数设计中存在的一些问题
举报原因:
原因补充:

(最多只允许输入30个字)