C++对C语言的非面向对象特性扩充(2)

上一篇随笔写了关于C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较,也得到了几位学习C++朋友们的帮助讲解,十分感谢,我也希望欢迎有更多学习C++的朋友一起来讨论,这样大家都能共同进步。那么,今天这篇要讲的是C++在函数原型上和C的区别、内联函数、带有默认参数的函数以及函数的重载。

  1.大家都熟悉在C中,如果函数调用的位置在函数定义之前,那么在函数调用之前要对函数原型声明或调用之前就把函数直接定义好了。比如:

#include<stdio.h>

int add(int x,int y);

int main()

{

  int x,y,sum;

  printf("请输入两个整数:\n");

  scanf("%d,%d",&x,&y);

  sum=add(x,y);

  printf("x+y=%d",sum);

  return 0;

}

int add(int x,int y)

{

  return x+y;  

}

不过也可以采用简洁的方式来声明,如:int add(); add(); 都可以通过编译;但是在C++里,如果函数定义在后,调用在前,那函数原型的声明必须是int add(int x,int y);函数名称,参数类型和个数,以及返回值都必须说明;如果函数定义在前,调用在后则和C一样。以上这种形式在C++里也等同于int add(int ,int);如果在原型说明中没有指出返回类型C++默认返回类型为int,不需要返回值,就用void。另外标准C++要求的main函数的返回值必须为int;

  2.内联函数就是在函数说明前冠以关键字"inline",当C++在编译时使用函数体中的代码插入到要调用该函数的语句之处,同时用实参代替形参,以便在程序运行时不再进行函数调用。比如:

#include <iostream>

using namespace std;

inline int add(int a,int b)

{

  return a+b;

}

int main()

{

  int x,y,sum;

  cin>>x>>y;

  sum=add(x,y);

  cout<<"x+y="<<sum<<endl;

  return 0;

}

在编译时,遇到函数啊add(x,y)时,用函数体代替add(x,y),同时实参代替形参,这样“sum=add(x,y)”被替换成“{

int a=x;int b=y;sum=a+b;}”;那么为什么要引入内联函数呢?主要是为消除函数调用时的系统开销,以提高系统的运行速度。在程序执行过程中调用函数,系统要将程序当前的一些状态信息存到栈中,同时转到函数的代码处去执行函数体的语句,这些参数保存和传递过程中需要时间和空间的开销,使得程序效率降低。但是并不是什么函数都可以定义为内联函数,一般情况下,只有规模很小而是用频繁的函数才定义为内联函数,这样可以大大提高运行速率。

  3.一般情况下,实参的个数应该和形参的一样,但在C++中则不一定,方法是在说明函数原型时,为一个或多个形参制定默认值,以后调用此函数,如省略其中一实参,C++自动地以默认值作为相应参数的值。比如int add(int x=10,int y=10),那么我们在调用该函数时可以有三种写法:add(50,50)//结果为50+50;add(50)//结果为50+10;add()//结果10+10;这样使函数更加灵活。但要注意的是默认参数必须是在参数列表的最右端,int add(int x,int y=10,int z)这样是错误的,还有不允许某个参数省略后,再给其后的参数指定参数值。如果函数定义在函数调用之后,则函数调用之前需要函数声明,此时必须在函数声明中给出默认值,在函数定义时就不要给出默认值了(因为有的C++编译系统会给出"重复指定默认值"的错误信息);

  4.函数的重载,对于这个我想学过C#的朋友一定在熟悉不过了,它意味着,只要函数参数的类型不同,或者参数的个数不同,或者两者兼而有之,两个或两个以上的的函数可以使用相同的函数名。尽管简单,但是我还是想说说它在C++里所要注意的几个问题:1.函数返回值不再函数参数匹配检查之列;2.函数重载与带默认参数的函数一起使用可能引起二义性比如:int fun(int x=0;int y=10){return x+y;}和int fun(int r){return r;}这时候我这样调用fun(10);3.如果函数调用给出的实参和形参类型不符,C++会自定执行类型转换,转换成功会继续执行,但是在这种情况下可能会出现不可识别的错误:int add(int x,int y)和long add(long,long),这时候我这样调用add(9.9,8.8);

  5.最后还是一样通过一个实例来总结一下今天的内容:

1 #include "stdafx.h"
2 #include <iostream>
3 usingnamespace std;

5 int add(int x,int y);//或int add(int,int)

7 inline int sub(int x,int y)//内联函数
8 {
9 return x-y;
10 }
11 
12 double mul(double x=10.0,double y=10.0);//带有默认参数的函数
13 
14 float add(float x,float y)//函数重载
15 {
16 return x+y;
17 }
18 
19 int main()
20 {
21 int x,y,result;
22 cout<<"请输入两个整数:";
23 cin>>x>>y;
24 result=add(x,y);
25 cout<<"普通函数(加法):x+y="<<result<<endl;
26 
27 cout<<"请输入两个整数:";
28 cin>>x>>y;
29 result=sub(x,y);
30 cout<<"内联函数(减法):x-y="<<result<<endl;
31 
32 double a,b,mul_result;
33 cout<<"请输入两个双精度数:";
34 cin>>a>>b;
35 mul_result=mul(a,b);
36 cout<<"带有默认参数的函数(乘法):a*b="<<mul_result<<endl;
37 
38 float c,d,sum;
39 cout<<"请输入两个单精度数:";
40 cin>>c>>d;
41 sum=add(c,d);
42 cout<<"重载加法函数:c+d="<<sum<<endl;
43 
44 return0;
45 }
46 
47 int add(int x,int y)
48 {
49 return x+y;
50 }
51 
52 double mul(double x,double y)
53 {
54 return x*y;
55 }

结果:

时间: 2024-12-13 23:22:01

C++对C语言的非面向对象特性扩充(2)的相关文章

C++对C语言的非面向对象特性扩充(3)

今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(reference):这也是C++对C语言的非面向对象特性扩充系列的最后一节. 1.如果有两个同名变量,一个是全局的,一个是局部的,那么局部的变量在其作用域拥有较高的优先权,全局变量则被屏蔽.那如果我希望在局部变量的作用域里使用全局变量怎么办,这时就要用到::作用域运算符了.比如: 1 #include<iost

Java语言中的面向对象特性

1.1 面向对象的基本概念  面向对象的基本思想  面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象.类.继承.封装.消息等基本概念来进行程序设计.从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式.开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域.其应用领域不仅仅是软件,还有计算机体系结构和人工智能等. 1. 对象的基本概念  对象是系统中用来描述客观事物的一个实体

Java语言中的面向对象特性总结

[课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知道java语言在面向对象编程方面有何独特的特点吗? 难点:  1. 理解方法重载和方法重写,不要混淆了两者的使用.  2. 类变量和类方法的使用.  3. 接口的使用. 3.1 面向对象技术基础 http://hovertree.com/menu/java/ 3.1.1 面向对象的基本概念  面向对象的基本思想  面向对象是一种新兴的程序设计方

Go语言学习(十一)面向对象编程-类型系统

1.类型系统介绍 对于面向对象编程的支持Go 语言设计得非常简洁而优雅.简洁之处在于,Go语言并没有沿 袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的 this 指 针等. 一个典型的类型系统通常包含如下基本内容: 基础类型,如 byte . int . bool . float 等: 复合类型,如数组.结构体.指针等: 可以指向任意对象的类型( Any 类型): 面向对象,即所有具备面向对象特征(比如成员方法)的类型: 接口. 因为Java语言自诞生以来被称为最纯

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效:但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends.implement).为了实现这些面向对象的特性,需要额外编写一些代码,如下.

PHP中面向对象特性实现

PHP近些年来成为全球最流行的网页编程语言,该语言以弱类型.易兼容.门槛低.开发快.功能强著称,且听别人这么说,我在有了c和c#基础后学习PHP过程中也并不是很顺利,该语言的一些特殊的语法规则又是让我混淆,不过不得不说,它让编程变得更加容易了.大家可能学习过C++或C#,应该知道面向对象的三大特征:封装性.继承性.多态性.其实任何一门编程语言,除了语言特有的API不同外,语言本身的编程思想和理念是想通的.现在,就让我带你走进PHP中面向对象特性的实现方式. 首先必须明白PHP为面向对象设定的6个

iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法

本分享是面向有意向从事iOS开发的伙伴们.或者已经从事了iOS的开发人员.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列.然后在開始Objective C语言的学习,假设您遇到问题也能够与我探讨,另外将无偿分享自己整理的大概400G iOS学习视频及学习资料.都是干货哦.能够新浪微博私信?关注极客James.期待与您的共同学习和探讨.! 由于时间有限,每天在工作之余整理的学习分享.难免有不足之

javascript 的面向对象特性参考

最近在看用javascript+css实现rich client.javascript 也是一个蛮有意思的语言.特别是其面向对象的实现和其他“标准”的OO launguage有很大的不同.但是,都是动态语言,我还是觉得它比起python语法和库都差得太远.可是没有explorer支持python开发 啊...:( 这是我学习javascript中面向对象特性的一点总结.希望对具有其他语言的面向对象设计经验的朋友理解javascript的OO有所帮助.我具有c++,java和python的面向对象

JAVA语言的11个特性

java语言的11个特性: java语言是一种简单的(Simple),面向对象的(Object-Oriented),分布式的(Distributed),解释性的(interpreted),健壮的(Robust),安全的(Secure),结构中立的(Architecture-neutral),可移植的(Portable),高性能的(high-performace),多线程的(multi-threaded),动态的(dynamic)语言. #1,简单 风格类似c++,基本语法与C相似 摒弃了C++中