c++ day04
2021-01-29 本文已影响0人
__method__
函数参数顺序
参数穿的顺序会对计算结果产生影响, 为了避免歧义出现,参数传递一定要注意顺序
- 函数参数的默认值
以下调用都是合理的
#include <iostream>
using namespace std;
void fun(int x = 1, int y = 2, int z = 3){
cout<<"x = "<< x<<" y = "<< y<<" z = "<< z<< endl;
}
int main()
{
fun();
fun(7);
fun(7, 8);
fun(7, 8, 9);
return 0;
}
下面调用的是合法的
#include <iostream>
using namespace std;
void fun(int x, int y, int z = 3){
cout<<"x = "<< x<<" y = "<< y<<" z = "<< z<< endl;
}
int main()
{
fun(7, 8);
fun(7, 8, 9);
return 0;
}
默认参数需要在必须参数之后全部定义
#include <iostream>
using namespace std;
void fun( int y, int x = 1, int z = 3){
cout<<"x = "<< x<<" y = "<< y<<" z = "<< z<< endl;
}
int main()
{
fun(7, 8);
fun(7, 8, 9);
return 0;
}
c++ 中不能指定引用参数作为默认值
int fun( int y, int x = 1, int &z = 3) // 不合法
内联函数
声明方式是返回值前加inline关键字, 目的是对一些函数体不是很大, 但又频繁被调用而且想要很高的效率的函数来进行声明
#include <iostream>
using namespace std;
inline int cube(int x){
return x*x*x;
}
int main()
{
int result;
result = cube(2);
cout<<"2*2*2 = " << result<<endl;
result = cube(3);
cout<<"3*3*3 = " << result<<endl;
return 0;
}
函数的重载 overload
什么是重载? 同名不同参
同名是函数名相同, 不同参是指 函数的参数类型和个数不相同, 这里与返回值没啥关系
// 重载
#include <iostream>
using namespace std;
int add(int x, int y){
return x + y;
}
int add(int x, int y, int z){
return x + y + z;
}
int add(double x, double y){
return x + y;
}
int main()
{
cout<<add(5, 3)<< endl;
cout<<add(5.8, 3.2)<< endl;
cout<<add(1, 2, 3)<< endl;
}
作用域
- 块作用域
{} 隔离代码的
在一个函数内部定义的变量或者在一个块中定义的变量称为局部变量
#include <iostream>
using namespace std;
void swap(int a, int b)
{
cout<<"(2)"<<a<<'\t'<<b<<'\t'<<endl;
if(a<b)
{
int t; //t是局部变量,退出该复合语句,则t不能使用
t=a; a=b; b=t;
}
cout<<"(3)"<<a<<'\t'<<b<<'\t'<<endl;
}
int main()
{
int a =10, b =20;
// cout<<"请输入两个整数: "<<endl;
// cin>>a>>b;
cout<<"(1)"<<a<<'\t'<<b<<'\t'<<endl;
swap(a,b);
cout<<"(4)"<<a<<'\t'<<b<<'\t'<<endl;
}
局部优先原则
#include <iostream>
using namespace std;
int main()
{
int a=1, b=2;
++a;
++b;
{
int b=4, c;
c=a+b; //c只能在该复合语句内使用
cout<<"a="<<a<<", "<<"b="<<b<<", "<<"c="<<c<<endl;
}
cout<<"a="<<a<<", "<<"b="<<b<<endl;
}
![](https://img.haomeiwen.com/i13248401/20e17de289f254af.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 文件作用域
在函数外面定义的变量或者用extern声明的变量
文件是c++的编译单位, 在所有函数外定义的标识符具有文件作用域, 作用域从定义点开始一直到本文件结束
#include <iostream>
using namespace std;
int i = 10;
int main()
{
// 在内部操作全局变量 :: 符合
int i, j = 5;
i=20; //访问局部变量i
::i=::i+4; //访问全局变量i
j=::i+i; //访问全局变量i和局部变量i、j
cout<<"::i="<<::i<<endl;
cout<<"i="<<i<<endl;
cout<<"j="<<j<<endl;
}
- 函数原型作用域
在原型函数的参数列表中声明的参数名;
作用域只在函数原型内; - 函数作用域
存储类别
局部变量的存储类别
c++中 局部变量的存储为
- auto 默认的不用写, 若没有明确的赋值, 初始值是不确定的
- static 静态局部变量被分配到静态存储中(具有记忆功能)
#include <iostream>
using namespace std;
int fun(int x) {
static int a = 3;
a += x;
return a;
}
int main() {
int k = 2, m = 1, n;
n = fun(k);
cout << "first: n=" << n << endl;
n = fun(m);
cout << "second: n=" << n << endl;
}
static版本的阶乘求解
#include <iostream>
using namespace std;
int fac(int n)
{
static int f=1;
f=f*n;
return(f);
}
int main() {
int i;
for (i=1; i<=5; i++)
cout<<i<<"!="<<fac(i)<<endl;
}
- register
适用于变量使用频繁的情况
int fac(register int n)
{
static int f=1;
f=f*n;
return(f);
}