chapter_6_

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
*/
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章