【c++基础】5.标识符、关键字、函数

来源:互联网 发布:逆战天梯怎么卡数据 编辑:程序博客网 时间:2024/06/05 14:07

【一】标识符和关键字


标识符是实体唯一标识,也就是实体名,比如变量名,函数名,类名,结构名等,都是标识符,标识符由用户(编程人员)自己定义,遵循一定的规则命名规则,具体如下:

第一个字符必须是字母或下划线;
后跟字母、下划线、或数字;
标识符对大小写敏感;
不能与c++保留字(即关键字)同名;

以上是c++命名必须遵循的名字规则,只要满足以上规则都是合法的标识符,但是合法的标识符并不一定就是好的标识符,比如:

int a;int student_number;int stu_num;

这三个名字都是合法的名字,但是第一个意义不明确,第二个意义明确但是太长,第三个在合适的应用场景下就比较合适。
一个好的命名规范不仅可以提高代码可读性,有时候还能减少代码出错的可能性,关于命名规范,可以参考Google的c++命名规范,到这里下载:链接

关键字是c++的保留字,不能作为标识符使用,ISO C++98/03关键字共63个,c++11新增了10个,一共73个。
关于c++关键字的详细信息,可以查看百度百科链接,上面有比较详细的说明,这些关键字不必要强记,多写代码,多看代码,会慢慢记住的。


【二】函数


函数是一组包含多个语句的语句块,用于完成一个小的功能模块。不要把这个函数和数学里的函数混淆起来,虽然他们有共通之处,都是为解决一个问题二设计的小功能模块,但数学里的函数主要是解决数学问题的,而c++中的函数更广义,当然也包括数学问题。
在类中,函数叫成员函数,是类对应的事物的行为的抽象。
每个c++程序的入口函数为main(),也就是说,只有有了main()函数你的程序才能执行。

1、函数声明

函数声明告诉编译器函数的名字,返回类型和参数列表,函数声明并不为函数创建实体,也就是没有函数体。声明之后的函数已经具有了函数调用所需的信息,但不能进行执行。格式如下:

return_type function_name(parameter_list);

如申明一个两整型的加法函数:

int add(int a,int b);

2、函数定义

函数定义为函数创建实体,经定义的函数才能执行。格式如下:

return_type function_name(parameter_list){//body of funciton;}

如两整型的加法函数定义:

int add(int a,int b){return a+b;}

在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

返回类型:一个函数可以返回一个值。return_type是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数主体:函数主体包含一组定义函数执行任务的语句。

函数声明和定义的区别和变量声明和定义的区别有点相似,声明就是只给出一个名和相关信息,定义时才为其创建实体,一般函数声明写在头文件中,而在cpp文件中进行实现。

3、函数调用

在调用某个函数之前必须声明该函数,一般把函数声明写在该文件的开头部分,或者包含已声明该函数的头文件。
当程序调用函数时,程序控制权会转移给被调用的函数,并用实参为形参初始化。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序,并返回return语句之后的值(如果有的话)。一个小例子:

#include <iostream>using namespace std;//声明函数,该函数完成两个int值的加法int add(int a,int b);int main(){int i=2;int j=3;//此处定义一个int型变量并将其初始化为add函数的返回值。int result=add(i,j);ocut<<"result of function:"<<result<<endl;return 0;}//函数定义,具体实现int add(int a,int b){return a+b;}

需要注意的是:在发生函数调用是,程序需要将主调函数的上下文保存下来(也就是当前指令的寄存器内容,具体介绍是在计算机组成原理或者计算机系统结构课程中,可以自行学习),以便返回主调函数时可以从调用处继续执行,这种保存上下文需要消耗很大开销,为了避免这种开销,c++中使用inline关键字来将函数声明为内联函数

编译器在调用内联函数的地方将内联函数展开,也就是用函数体代替函数名。
如:

//定义内联函数inline int add(int a,int b){return a+b;}//调用内联函数int x=1,y=2;cout<<add(x,y)<<endl;

调用的地方被展开为:

cout<<(x+y)<<endl;

inline关键字只是给编译器一个建议,编译器可以忽略这个建议不进行展开而进行函数调用,这是因为如果函数体太大,展开所用的开销将大于函数调用有的甚至不能进行展开,此时编译器将忽略inline。

4、函数重载

两个函数若除了参数列表不同外,其他都相同,那么称这个函数被重载,重载函数通过参数列表来区分具体调用的实例,比如,要进行两个数的加法,但加数类型不确定,那么就可以使用重载函数来进行,如下:

#include <iostream>using namespace std;//声明函数,该函数完成两个int值的加法int add(int a,int b);//当然你也可以不声明,直接定义double add(double a,double b){cout<<"add two double"<<endl;return a+b;}int main(){int i=2;int j=3;double x=2.0;double y=3.0;//此处定义一个int型变量并将其初始化为add函数的返回值。int result=add(i,j);cout<<"result1:"<<result<<endl;//可以将返回值直接输出cout<<"retult2:"<<add(x,y)<<endl;return 0;}//函数定义,具体实现int add(int a,int b){cout<<"add two integer"<<endl;return a+b;}

输出:

add two integer
result1:5
add two double
retult2:5

5.函数参数

函数实参的类型必须与形参类型匹配,实参用于调用时为形参进行初始化,是主调函数与被调函数之间传递参数的一种方式,函数参数的类型根据需要可以是任意的,包括用户自定义类型,参数类型可以是一个变量,或者一个指针,或者一个引用。按照参数类型的不同,可以将函数调用分为传值调用、指针调用和引用调用。

传值调用:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用:该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用:该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

具体使用哪种方法,还要看具体应用,如果你需要在函数中改变主调函数中的值,可以选择使用指针调用或者引用调用,否则使用传值调用。

6、参数默认值

可以为函数参数指定一个默认值,如果函数调用时为传入值,将使用默认值,如下:

#include <iostream>using namespace std;//声明函数,第二个参数默认为10int add(int a,int b=10){return a+b;}int main(){int i=2;int j=3;//调用时只传入一个参数,第二个参数缺省,使用默认值int result=add(i);ocut<<"result of function:"<<result<<endl;return 0;}

由于函数调用参数列表是从左到右匹配的,故函数默认值必须从右到左设置,否则无法进行匹配。

阅读全文
0 0