函数的调用需要完成两项工作:
一、实参初始化对象的形参
二、将控制权交给函数,主调函数中断,被调函数运行。
函数的返回类型不能是数组。
数组不可以做函数返值的原因在于,函数的返值是赋值传递的,而数组不可以进行简单赋值。也就是函数的返回值是简单的临时变量方法,所以不支持是数组。
当然,函数不能返回函数,虽然不知道为什么,但是这样做值没有意义的。
应该尽可能使用引用传递从而避免拷贝。
再次探讨const
在传递参数的时候,参数的顶层const被忽略掉了。
因为使用一个非常量给常量赋值总是可以的。即我们可以使用一个非常量初始化一个底层const,但是反过来不行。不能使用一个底层const初始化一个非常量。
#include<bits/stdc++.h>
using namespace std;
int main(){
const int *x=0;
int *y=x;//不能用一个非常量初始化一个底层const
return 0;
}
数组形参:
数组有两个性质:不允许拷贝数组,使用数组的时候可能会转化为指针。
所以我们使用一个数组的时候实际上使用的是数组的的指针。
使用函数作为形参
#include<bits/stdc++.h>
using namespace std;
void print(int (&a)[10]){ a[1]=9;}
int main(){
//数组引用形参
int a[10];
print(a);
cout<<a[1];
return 0;
}
此外:无返回值void函数在最后一行隐式添加了一个return。
值是如何被返回的?
是通过建立一个临时变量,通过这临时变量返回的,所以不能返回局部对象的引用或者指针。
返回一个数组
返回数组可以通过指针,可以通过引用,但是也可以通过如下方式
#include<bits/stdc++.h>
using namespace std;
int a[10];
int (*tool())[10]{//如果没有括号返回的将是指针的数组,
return &a;
}
int main(){
//返回一个数组
a[1]=2;
for(int i=1;i<10;i++)a[i]=i;
int (*p)[10]=tool();
cout<<(*p)[1];//p指向一个数组,数组大小为10,10解引用之后是一个数组名字
return 0;
}
或者使用decltype
using namespace std;
int a[10];
using ok=decltype(&a);
ok tool1(){
return &a;
}
int main(){
//返回一个数组
a[1]=2;
for(int i=1;i<10;i++)a[i]=i;
int (*p)[10]=tool1();
cout<<(*p)[1];//p指向一个数组,数组大小为10,10解引用之后是一个数组名字
return 0;
constexpr 函数:函数约定:所有形参返回值必须是字面值类型(字面值类型并不是指就是const。),允许返回非常量。
但是如果非常量在使用过程中错误的被当做常量使用,编译器会报错。
在函数参数中内置类型的提升和转换带来的不可意料的转换。
小整形一般会直接提升为整型
#include<bits/stdc++.h>
using namespace std;
void f(int i){ cout<<"int";}
void f(short i){ cout<<"short";}
int main(){
f('a');
return 0;
}
//输出如下
//int
//Process returned 0 (0x0) execution time : 0.059 s
//Press any key to continue.
算数类型转换的级别都一样,并没有优先级之分。
#include<bits/stdc++.h>
using namespace std;
void f(long i){ cout<<"long";}
void f(float i){ cout<<"float";}
int main(){
f(3.14);//出现二义性错误
return 0;
}