C++引用使用时的难点:
当函数返回值为引用时
若返回栈变量
不能成为其它引用的初始值
不能作为左值使用
若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用
栈变量做返回值:
int getA1()
{
int a = 10;
return a;
}
//若返回栈变量 不能成为其他引用变量的初始值
// 返回a引用 就是返回a的本身 返回a的一个副本 10
int& getA2()
{
int a = 10;
return a; //返回引用的本质 是c++编译器帮我们取地址 也就是用一个常量指针指向了一个被释放的内存空间 但是返回值在寄存器中存放
}
int* getA3()
{
int a = 10;
return &a;
}
void main()
{
int a1 = getA1(); //10的值返回出去了 一般情况下把返回值放在寄存器中
int a2 = getA2();
//因为引用所依附的内存空间已经被释放
int &a3 = getA2(); //a3在debug下是个乱码 release下正常 相当于存放a的地址
int *a4 = getA3();
printf("a1:%d,a2:%d,a3:%d",a1,a2,a3); //*a3
cout << "hello!" << endl;
system("pause");
return;
}
静态变量做返回值:
int& j2()
{
static int a = 10;
a++;
return a;
}
//若返回静态变量 或者 全局变量
// 可以成为其他引用的初始值
// 既可作右值使用 也可作左值使用
void main()
{
int a1 = 10;
int a2 = 20;
a1 = j1();
a2 = j2();
int &a3 = j2();
cout << "hello!" << endl;
system("pause");
return;
}
-----函数当左值:
//返回一个int变量的值 也就是11
int g()
{
static int a = 10;
a++;
return a;
}
//返回变量本身
int& g2()
{
static int a = 10;
a++;
return a;
}
int* g3()
{
static int a = 10;
a++;
return &a;
}
void main()
{
//g() = 100; ==》 11=100;
g2() = 100; //通过 ==>a=100; //函数返回值是一个引用 并且当左值
*g3() = 200; //通过
printf("%d ",*g3());//201
cout << "hello!" << endl;
system("pause");
return;
}
//最主要看一个内存空间是不是一个有效的内存空间