函数返回引用深入解析
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;
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;
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;
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