C++ 补充 & C++ 11 - 函数返回引用深入解析

    技术2022-07-10  128

    函数返回引用深入解析

    C++引用使用时的难点

    1.当函数返回值为引用时

    若返回栈变量,不能成为其它引用的初始值,不能作为左值使用

    2. 若返回静态变量或全局变量

    可以成为其他引用的初始值 即可作为右值使用,也可作为左值使用

    3. 返回形参当引用 (注:C++链式编程中,经常用到引用,运算符重载专题)

    demo 代码(一)

    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int& demo() { int i = 666; i++; return i; } int main(void) { int& i1 = demo(); /* 函数返回引用成为其它引用的初始值 */ printf("i1=%d \n", i1); system("pause"); return 0; }

    编译:

    因为 int i = 666 是临时变量(执行后就会被释放), 存放在栈上, 只是暂时这个栈没有被调用

    执行:

    demo 代码(二)

    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int& demo(int **addr) { int i = 666; *addr = &i; printf("i 的地址: %p , i=%d\n", &i, i); return i; } int main(void) { int* addr = NULL; int& i1 = demo(&addr); /* 函数返回引用成为其它引用的初始值 */ printf("addr: %p, i1=%d \n", addr, i1); system("pause"); return 0; }

    编译:

    执行:

    demo 代码(三)

    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int& demo(int **addr) { int i = 666; *addr = &i; printf("i 的地址: %p , i=%d\n", &i, i); return i; } int main(void) { int* addr = NULL; int& i1 = demo(&addr); /* 函数返回引用成为其它引用的初始值 */ printf("addr: %p, i1=%d \n", addr, i1); i1 = 888; demo(&addr); printf("addr: %p, i1=%d \n", addr, i1); system("pause"); return 0; }

    编译:

    执行:

    demo 代码(四)

    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int demo1() { int i = 0; printf("i 的地址: %p, i=%d\n", &i, i); return i; } int& demo(int **addr) { int i = 666; *addr = &i; printf("i 的地址: %p , i=%d\n", &i, i); return i; } int main(void) { int* addr = NULL; int& i1 = demo(&addr); /* 函数返回引用成为其它引用的初始值 */ printf("addr: %p, i1=%d \n", addr, i1); i1 = 888; //demo(&addr); demo1(); printf("addr: %p, i1=%d \n", addr, i1); system("pause"); return 0; }

    编译:

    因为临时变量保存到-> 栈(调用函数或保存传递的形参或临时变量) 再次调用demo1(), 会覆盖临时变量.

    执行:

    demo 代码(五)

    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int demo1() { int i = 0; printf("i 的地址: %p, i=%d\n", &i, i); return i; } int& demo(int **addr) { int i = 666; *addr = &i; printf("i 的地址: %p , i=%d\n", &i, i); return i; } int main(void) { int* addr = NULL; /* 第一种情况 函数返回局部变量引用不能成为其他引用的初始值 */ // int& i1 = demo(&addr); // i1 = 888; // printf("addr: %p, i1=%d \n", addr, i1); // demo(&addr); // demo1(); // printf("addr: %p, i1=%d \n", addr, i1); /* 第二种情况 函数返回局部变量做为左值 ? */ demo(&addr) = 888; printf("1 addr: %p value: %d\n", addr, *addr); demo1(); printf("2 addr: %p value: %d\n", addr, *addr); system("pause"); return 0; }

    编译:

    执行:

    demo 代码(六)

    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int demo1() { int i = 0; printf("i 的地址: %p, i=%d\n", &i, i); return i; } int& demo(int **addr) { int i = 666; *addr = &i; printf("i 的地址: %p , i=%d\n", &i, i); return i; } int& demo_static(int** addr) { static int i = 666; *addr = &i; printf("i 的地址: %p , i=%d\n", &i, i); return i; } int main(void) { int* addr = NULL; /* 第一种情况 函数返回局部变量引用不能成为其他引用的初始值 */ // int& i1 = demo(&addr); // i1 = 888; // printf("addr: %p, i1=%d \n", addr, i1); // demo(&addr); // demo1(); // printf("addr: %p, i1=%d \n", addr, i1); /* 第二种情况 函数返回局部变量做为左值 ? */ /*demo(&addr) = 888; printf("1 addr: %p value: %d\n", addr, *addr); demo1(); printf("2 addr: %p value: %d\n", addr, *addr);*/ /* 第三种情况 返回静态变量或全局变量 */ demo_static(&addr) = 888; printf("1 addr: %p value: %d\n", addr, *addr); demo1(); printf("2 addr: %p value: %d\n", addr, *addr); system("pause"); return 0; }

    编译:

    执行:

    结语:

    总的来说, 主要看这个变量的生存周期

    时间: 2020-07-01

    Processed: 0.010, SQL: 9