常见的导航网站有哪些,兼职招聘网站,注册公司注册资金要求,vs做网站怎么把网页改为自适应大小函数返回值时#xff0c;要生成一个值的副本。而用引用返回值时#xff0c;不生成值的副本。例如#xff0c;下面的程序是有关引用返回的4种形式#xff1a;//*********************//** ch9_6.cpp **//********************* #include iostream.h float tem…函数返回值时要生成一个值的副本。而用引用返回值时不生成值的副本。例如下面的程序是有关引用返回的4种形式//*********************//** ch9_6.cpp **//********************* #include iostream.h float temp; float fn1(float r) { temp r*r*3.14; return temp; } float fn2(float r) { temp r*r*3.14; return temp; } void main() { float afn1(5.0); //1 float bfn1(5.0); //2:warning float cfn2(5.0); //3 float dfn2(5.0); //4 coutaendl; coutbendl; coutcendl; coutdendl; } 运行结果为 785 785 785 785 对主函数的4种引用返回的形式 程序的运行结果是一样的。但是它们在内存中的活动情况是各不相同的。其中变量temp是全局数据驻留在全局数据区data。函数main()、函数fnl()或函数fn2()驻留在栈区stack。 第一种情况见图9-5。 图9-5 返回值方式的内存布局 这种情况是一般的函数返回值方式。 返回全局变量temp值时C创建临时变量并将temp的值78.5复制给该临时变量。返回到主函数后赋值语句afnl(5.0)把临时变量的值78.5复制给a。 第二种情况见图9-6。 图9-6 返回值初始引用的情形 这种情况下函数fnl()是以值方式返回的返回时 复制temp的值给临时变量。返回到主函数后引用b以该临时变量来初始化使得b成为该临时变量的别名。由于临时变量的作用域短暂所以b面临无效的危险。 根据C标准临时变量或对象的生命期在一个 完整的语句表达式结束后便宣告结束也即在“float bfnl(5.0)”之后临时变量不再存在。 所以引用b以后的值是个无法确定的值。BC对C标准进行了扩展规定如果临时变量或对象作为引用的初始化时则其生命期与该引用一致。14.7节将进一步介绍这一内容。 这样的程序 依赖于编译器的具体实现所以移植性是差的。 若要以返回值初始化一个引用应该先创建一个变量将函数返回值赋给这个变量然 后再以该变量来初始化引用就像下面这样 int xfnl(5.0) int bx 第三种情况见图9-7。 图9—7 返回引用方式 这种情况函数fn2()的返回值不产生副本所以 直接将变量temp返回给主函数。主函数的赋值语句中的左值直接从变量temp中得到复制这样避免了临时变量的产生。当变量temp是一个用户自定义的类型时这种方式直接带来了程序执行效率和空间利用的利益。 第四种情况见图9-8。 图9—8 返回引用方式的值作为引用的初始化 这种情况 函数fn2()返回一个引用因此不产生任何返回值的副本。在主函数中一个引用声明d用该返回值来初始化使得d成为temp的别名。由于temp是全局变量 所以在d的有效期内temp始终保持有效。这样做法是安全的。 但是 如果返回不在作用域范围内的变量或对象的引用 那就有问题了。这与返回一个局部作用域指针的性质一样严重。BC作为编译错误VC作为警告来提请编程者注意。例如下面的代码返回一个引用来给主函数的引用声明初始化 float fn2(float r) { float temp tempr*r*3.14 return temp } void main() { float dfn2(5.0) //error返回的引用是个局部变量 } 见图9-9说明。 图9-9 返回的引用是局部变量 如果返回的引用是作为一个左值进行运算也是程序员最犯忌的。所以如果程序中有下面的代码则一定要剔除 float fn2(float r) { float temp tempr*r*3.14 return temp } void main() { fn2(5.0)12.4 //error返回的是局部作用域内的变量 }