c++笔记

前排切记:写完一次笔记就上传!!!!血泪教训!!!

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修饰符,则成为静态全局变量。静态全局变量只能在本文件中使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值