1. 函数的返回类型不能是数组或者函数,但是可以是指向数组或者函数的指针
2. 实参和形参区别:
形参:函数定义时的参数,无赋值的参数,用来说明参数类型
实参:函数调用时的参数,赋值的参数,函数实际操作的对象
3. 形参、局部变量、局部静态变量的区别
局部变量(local variable):函数体内部定义的变量和形参统称为局部变量
局部静态变量(local static variable):直到程序结束时才销毁的对象,不受块的约束
4. 练习6.7,编写函数,第一次被调用时返回0,以后每次被调用返回值加1。
#include<iostream>
using namespace std;
int T(){
static int count = -1;
count++;
return count;
}
int main(){
int ret;
for(int i=0; i<5; i++){
ret = T();
cout<<ret<<endl;
}
}
5.参数传递:引用传递、值传递、指针传递
引用传递:形参是引用类型,它将被绑定到对应的实参;
值传递:将实参的值拷贝后赋给形参(包括指针),对变量的改动不会影响初始值
指针传递:指针的行为同其它非引用类型一样,当执行指针拷贝操作时,拷贝的是指针的值,即其地址
避免使用引用的过程中拷贝,因为如果对象特别巨大,拷贝的过程会非常缓慢,造成程序低效
使用引用传递可以避免拷贝,有的类型并不支持拷贝操作,只能通过引用形参进行访问;当函数无须修改引用形参的值时,最好使用常量引用。如:
bool isShorter(const string &s1, const string &s2){
return s1.size() < s2.size();
}
练习6_10:使用指针形参交换两个整数的值
#include<iostream>
using namespace std;
//练习6.10
void exchange_pointer(int *n1, int *n2){
int temp = *n1;
*n1 = *n2;
*n2 = temp;
}
void exchange_value(int &n3, int &n4){
int temp = n3;
n3 = n4;
n4 = temp;
}
int main(){
int n1 = 10, n2 = 20;
cout<<"值传递交换前的地址和值:"<<endl;
cout<<"&n1:"<<&n1<<" n1:"<<n1<<endl;
cout<<"&n2:"<<&n2<<" n2:"<<n2<<endl;
exchange_pointer(&n1, &n2);
cout<<"交换后的地址和值:"<<endl;
cout<<"&n1:"<<&n1<<" n1:"<<n1<<endl;
cout<<"&n2:"<<&n2<<" n2:"<<n2<<endl;
int n3 = 30, n4 = 40;
cout<<"引用传递交换前的地址和值:"<<endl;
cout<<"&n3:"<<&n3<<" n3:"<<n3<<endl;
cout<<"&n4:"<<&n4<<" n4:"<<n4<<endl;
exchange_value(n3, n4);
cout<<"交换后的地址和值:"<<endl;
cout<<"&n3:"<<&n3<<" n3:"<<n3<<endl;
cout<<"&n4:"<<&n4<<" n4:"<<n4<<endl;
return 0;
}
/*
指针值传递,可以看到虽然交换了n1和n2的数值,但是n1和n2的地址并没有改变
值传递交换前的地址和值:
&n1:0x7ffd5472b8fc n1:10
&n2:0x7ffd5472b8f8 n2:20
交换后的地址和值:
&n1:0x7ffd5472b8fc n1:20
&n2:0x7ffd5472b8f8 n2:10
引用传递交换前的地址和值:
&n3:0x7ffd5472b8f4 n3:30
&n4:0x7ffd5472b8f0 n4:40
交换后的地址和值:
&n3:0x7ffd5472b8f4 n3:40
&n4:0x7ffd5472b8f0 n4:30
*/
6. const引用
常量引用:当形参的顶层为const,接收常量对象或者非常量对象均可
非常量引用:无const,只能接收非常量对象,否则编译报错
7. 6_22,交换两个int指针,可以和6_10作对比
//6.22 交换两个int指针
void exchange_int_pointer(int* &n5, int* &n6){
int *temp = n5;
n5 = n6;
n6 = temp;
}
int main(){
int n5 = 50, n6 = 60;
int *n5_pointer = &n5;
int *n6_pointer = &n6;
cout<<"交换前的地址和值:"<<endl;
cout<<"n5_pointer:"<<n5_pointer<<" n5:"<<n5<<" *n5_pointer:"<<*n5_pointer<<endl;
cout<<"n6_pointer:"<<n6_pointer<<" n6:"<<n6<<" *n6_pointer:"<<*n6_pointer<<endl;
exchange_int_pointer(n5_pointer, n6_pointer);
cout<<"交换后的地址和值:"<<endl;
cout<<"n5_pointer:"<<n5_pointer<<" n5:"<<n5<<" *n5_pointer:"<<*n5_pointer<<endl;
cout<<"n6_pointer:"<<n6_pointer<<" n6:"<<n6<<" *n6_pointer:"<<*n6_pointer<<endl;
return 0;
}
/*
可以看到交换之后n5,n6的值没变,但是n5_pointer和n6_pointer的值及其指向的对象发生了改变
交换前的地址和值:
n5_pointer:0x7fff7609bee8 n5:50 *n5_pointer:50
n6_pointer:0x7fff7609bee4 n6:60 *n6_pointer:60
交换后的地址和值:
n5_pointer:0x7fff7609bee4 n5:50 *n5_pointer:60
n6_pointer:0x7fff7609bee8 n6:60 *n6_pointer:50
*/