私募基金网站怎么做seo,做网站用哪个版本的eclipse,长沙公司网站建设,网站设计公司推荐前言 编程是极其注重实践的工作,学习的同时要伴随代码
引入 此前对返回指针和引用有一些纠结#xff0c;从return角度来观察发生了什么。
return机制 函数中return表示代码结束#xff0c;如果return后面有其他代码将不被执行。 return发生了值转移#xff0c;return后面的…前言 编程是极其注重实践的工作,学习的同时要伴随代码
引入 此前对返回指针和引用有一些纠结从return角度来观察发生了什么。
return机制 函数中return表示代码结束如果return后面有其他代码将不被执行。 return发生了值转移return后面的变量或者值被复制到新变量(地址)中然后栈空间被释放。 下面以一段代码演示return以及查看返回指针和引用发生了什么
#includeiostream
using namespace std;int* fun_pt(int tmp); //返回指针
int fun_ref(int tmp); //返回引用return值
int ret_ref(int tmp); //返回引用return引用int main(void) {int* a fun_pt(3);cout 指针指向数据为 *a endl; //返回临时变量指针得不到准确结果cout endl;int b fun_ref(3); //返回临时变量引用值接收得到准确结果cout 引用指向数据为 b endl;cout endl;int c ret_ref(3); //返回临时变量引用值接收得到准确结果cout 引用指向数据为 c endl;int d ret_ref(4); //返回临时变量引用引用接收得不到准确结果cout 引用指向数据为 d endl;
}int* fun_pt(int tmp) {int a tmp;return a; //返回临时变量地址
}int fun_ref(int tmp) {int a tmp;return a; //返回临时变量的引用return值
}int ret_ref(int tmp) {int a tmp;return a; //返回临时变量的引用return引用
}
测试结果如下
指针指向数据为-858993460引用指向数据为3引用指向数据为3
引用指向数据为1923686208
说明 1.return后面跟变量值或者引用表达意思是一样的。 因为return表示把表达式赋值给返回类型。例如fun_pt的return a;表示int *(变量名)接收a.在main()函数中的int* a fun_pt(3);表示指针变量a接收。此时引用在等号右边在上一篇对引用分析的帖子C语法应用:返回指向局部变量的引用__使用new分配空间(不推荐)-CSDN博客中提到过引用在等号右边时,相当于解引用指针(取值)所以在fun_ref和ret_ref两个函数中表示的意思是一样的返回整型值a。 2.返回临时变量的指针得不到正确结果。 在return a时将计算好的a地址赋值给int* 类型变量a两个a不一样一个是栈区的临时变量一个是main函数中的临时变量这个动作完成后栈区内存被释放。当下一句*a表示要取整型指针a指向的数据时原有数据已不存在所以得到结果是一个看起来很大的数字。 3.返回局部变量的引用能否得到正确结果取决于用变量接收还是引用接收 1当返回的引用类型采用变量接收时发生了值转移得到的结果是正确的。代码中
int b fun_ref(3);
int c ret_ref(3); 说明了这一点。而且他们的好处是return时没有使用数据副本节约了内存空间。 2当返回的引用类型使用引用接收时相当于临时变量的指针返回给引用所以再次使用该引用时得不到正确结果。代码中
int d ret_ref(4);
cout 引用指向数据为 d endl; //内存已被释放d取到的值错误 说明了这一点。
使用对象测试 再用类试一下这个观点是否正确。声明一个类
class Demo {int age;
public:Demo(int ag):age(ag){}int get_age() { return age; }void set_age(int ag) { age ag; }
}; 声明一个全局函数为了看起来更清晰不用OOP写成对象方法(写成对象方法也不会错结果不变)
Demo fun_demo(int age) {Demo demo(age); //生成临时对象return demo; //返回该对象
}
测试代码
int main(void) {Demo demo fun_demo(18); //变量接收结果正确cout 你设置的对象的年龄为 demo.get_age() endl; Demo demo2 fun_demo(18); //引用接收结果错误cout 你设置的对象的年龄为 demo2.get_age() endl;
}
运行结果
你设置的对象的年龄为18
你设置的对象的年龄为32759
结论与前面一致。
顺便提一下在构造函数中常用的传入引用返回该引用做属性。这是一种很常见的---使用引用控制传入对象的方法。和这里的代码不矛盾相当于引用接收引用而使用引用可以修改原值。
小结 在实践中发现了C Prime Plus6th Edition中一个描述不完整的地方。书中描述不要返回局部变量或临时变量的引用。而实际情况是可以返回局部变量或临时变量的引用必须用变量接收。