前排切记:写完一次笔记就上传!!!!血泪教训!!!
c++笔记
函数的定义
一般格式
<函数值类型><函数名>(<形参列表>)
{
语句序列
}
函数值类型——
eg:int、long、float、double、char…
(1)返回简单类型
(2)返回结构类型
(3)返回指针类型
(4)返回引用类型
如果无返回值 此时函数记为void 即无类型或空类型。
对于有返回值的函数,必须使用返回语句,以便将值返回给调用函数,值本身可以是常量、变量、表达式,但其结果必须为typeName类型或可以被转换为typeName类型(例如:返回类型是double 而函数返回一个int表达式,则该int值将被强制转换为double类型)
注意:c++函数不能直接返回数组,但可以将数组作为结构或对象组成部分返回。
函数的声明
在C++中,程序编译的单位是源程序文件(即源文件),一个由多个函数构成的程序可以组织存放在一个或多个源文件中。
在源文件中,函数之间的排列顺序没有固定的要求,但要满足**“先定义后使用”**的原则。
对于标准库函数的使用,在程序开头使用#include命令将所需的头文件包含进来即可。
函数的声明是指在函数被调用之前对函数的类型、名称以及参数等信息所作的说明。函数声明的格式如下:
类型名函数名(类型1 形参1,类型2形参2,…) ;
或
类型名函数名(类型1,类型2,…) ;//可省略形参
在形式上就是在函数定义的首部后加分号(😉 构成。函数声明说明了函数所采用的形式,称为函数原型。
函数的原型及调用
函数的调用已经是老生常谈的内容了,但在学习中 往往忽略了对函数原型的了解。因为函数原型就隐藏在include文件中。
首先 是函数原型的作用:
- 原型描述了函数到编译器的接口,它将函数返回值类型(如果有的话)以及参数的类型和数量告诉编译器。
函数的调用
-
函数定义后,并不能自动执行,必须通过函数调用来实现函数的功能。
-
函数调用,即控制执行某个函数。
-
C++中,主函数可以调用其它子函数,而其它函数之间也可以相互调用。
函数调用的一般格式:
<函数名>(<实际参数表>) //有参调用
或
<函数名>()/ /无参调用
其中:
- <函数名>为要使用的函数的名字。
- 实际参数表>是以逗号分隔的实参列表,必须放在一对圆括号中。<实参表>与<形参表>中参数的个数、类型和次序应保持一致。
- 当调用无参函数时,函数名后的圆括号不能省略
1.实参的几种形式
- 形参为简单类型变量,对应的实参可以是:常量,变量及表达式。
- 形参为数组,对应的实参为数组(名)。
- 形参为结构类型,对应的实参为结构类型变量。
如:调用已知三边求三角形面积的函数Area。
double Area(double,double,double); //函数声明
cout<<Area(4.0,5.0,6.0)<<endl; //常量作实参
cout<<Area(a,b,c)<<endl; //变量作实参
cout<<Area(a+1,b+1,c+2)<<endl; //表达式作实参
内联函数
作用:
减少函数调用的开销。
格式:
inline<函数值类型><函数名>(<形式参数表>)
{
函数体
}
-
对用户来说,内联函数的定义与调用与普通函数的使用方法是相似的。
-
作为编译系统,它将程序中调用内联函数的语句(或表达式)用内联函数体中的代码进行替换。这样在执行时就避免了对内联函数的调用,从而减少了因函数调用所增加的时间开销,提高了程序运行的效率。
-
使用内联函数可以节省运行时间,但却增加了目标程序的的长度。因此一般只将规模很小而使用频繁的简单函数声明为内联函数。
//eg:编写程序,计算12+22+32+...+ 102,将计算整数平方的功能定义为内联函数。
inline int square(int x)
{
return x*x;
}
int main()
{
int i,sum=0;
for(i=1;i<=10;i++)
sum+=square(i);
cout<<"sum="<<sum<<endl;
}
/*说明:编译程序在遇到内联函数调用式square(i)时,就用square函数体中代码代替square(i),同时将实参代替形参。这样语句
1十=square(i);将被替换为sum+=i*i;*/
函数重载
定义:
函数重载是指在一个程序中,可以定义多个具有相同函数名,不同参数列表的函数(至少参数的类型或参数个数或参数类型的顺序不同)。这些的函数被称为重载函数。
当调用一个重载函数时,编译系统将通过检查函数调用中的实参个数、类型和顺序来选择恰当的函数。
重载函数通常用于实现功能类似而所处理的数据类型不同的问题。
变量的作用域
-
变量的作用域是指变量的使用范围。
-
根据变量的使用范围不同,C++中的变量被分为局部变量和全局变量。
局部变量
-
在一个函数内或复合语句内定义的变量称为局部变量(函数的形参也属于局部变量)。
-
局部变量只允许在其定义的函数或复合语句中使用,离开所在的函数或复合语句后该局部变量将不能使用。
说明:局部变量是在执行该函数或复合语句时自动建立,当该函数或复合语句执行完毕后将自动释放。所以在不同的函数或复合语句中定义同名的局部变量,也不会相互干扰。局部变量也称为自动类型变量。
全局变量
- 全局变量说明于所有函数之外,可以为所有函数共同使用。
- 全局变量可以在各个函数之间建立数据的传输通道。
notice:
函数中局部变量优先于全局变量
在函数中,当局部变量与全局变量同名时,遵循“局“变量优先”的原则。这时,如果想使用全局变量,应在变名前加上作用域运算符"::"即可。
全局变量的作用范围是从定义点到整个源程序的结束。在定义点之前,如果其它函数要引用全局变量,可以在该函数中用extern对全局变量进行声明。
变量的存储类型
定义:
不同的变量所分配的存储区域也不同,这就是变量的存储类型。
c++程序运行时使用内存
堆区 | 存放动态分配的数据 | ||||
---|---|---|---|---|---|
栈区 | 存放局部数据,如 局部变量 | ||||
全局数据区 | 存放全局数据和静态数据,如全局变量 | ||||
程序代码区 | 代码块 |
变量的存储类型
变量的存储类型是变量在内存中存储的方式,根据变量的存储类型,可以知道变量的作用域和生存期。这里,介绍4个存储类型,分别是auto (自动类) ,register(寄存器类),static(静态类)和extern(外部类)。
在c++中定义一个变量的完整形式是:
<存储类型><数据类型><变量名>;
-
自动变量-用auto修饰(默认的定义方式)。
如:定义一个局部变量。
auto int i;与int i;是相同的。
说明:自动变量在其定义块(函数或复合语句)开始执行时分配空间,在块执行结束时释放空间。所以自动变量的生命期开始于块的执行,终止于块的结束。
-
寄存器变量—用register修饰
将尽可能存放在CPU的寄存器中,以提高程序的运行效率注意,仅局部变量和形参可作为寄存器变量。
-
静态变量-用static修饰
静态变量分配在全局数据区中,定义时系统将提供默认的初始值。
静态变量在编译时分配存储空间,在整个程序执行结束后释放存储空间。所以,静态变量具有全局生命期。
根据声明的位置不同,静态变量又分为静态局部变量和静态全局变量。
静态局部变量是在“块”中定义的静态变量。它具有局部作用域,却有全局生命期。在“块”执行结束后,该静态局部变量并不释放(其值依旧存在),以便下次调用时可继续使用。
-
外部变量-用extern修饰
如果在一个源文件中定义的全局变量要在其它源文件中使用,则在使用前应该用extern进行声明,表示该全局变量不是在本文件中定义的。
-
静态全局变量:
全局变量可以在其它源文件中使用。如果在全局变量前加上static修饰符,则成为静态全局变量。静态全局变量只能在本文件中使用。