1.小伙伴们都出去玩了T……T
2.喜爱的书到啦!!!一会儿去取!!!
///将引用用于结构
/*引用非常适合用于结构和类。
下面的程序不仅引用了结构,它还让函数返回指向结构的引用,它与返回结构有所不同。通常将返回的引用
声明为const。*/
#include<iostream>
using namespace std;
struct sysop
{
char name[26];
char quote[64];
int used;
};
const sysop & use(sysop & sysopref);///function with a reference return type
int main()
{
sysop looper =
{
"Rick \"Fortran\" Looper",
"I'm a goto kind of guy.",
0
};
use(looper);
cout << "Looper: " << looper.used << " use(s)\n";
sysop copycat;
copycat = use(looper);
cout << "Looper: " << looper.used << " use(s)\n";
cout << "Copycat: " << copycat.used << " used(s)\n";
cout << "use(looper): " << use(looper).used << " used(s)\n";
return 0;
}
///use() return the reference passed to it
const sysop & use (sysop & sysopref)
{
cout << sysopref.name << " says:\n";
cout << sysopref.quote << endl;
sysopref.used++;
return sysopref;
}
/*
Rick "Fortran" Looper says:
I'm a goto kind of guy.
Looper: 1 use(s)
Rick "Fortran" Looper says:
I'm a goto kind of guy.
Looper: 2 use(s)
Copycat: 2 used(s)
Rick "Fortran" Looper says:
I'm a goto kind of guy.
use(looper): 3 used(s)
Process returned 0 (0x0) execution time : 0.437 s
Press any key to continue.
*/
/*
程序说明:该程序尝试了3个新的领域
第一个是使用指向结构的引用,use(looper);
该函数调用将结构looper按引用传递给use()函数,使得sysopref成为looper的别名。当use()函数显示
sysopref的name和quote成员时,实际显示的是looper的成员。另外,当函数将sysopref.used加1时,实际
上是将looper.used加1.
第二个是将引用作为返回值。通常,返回机制将返回值复制到临时存储区域中,随后调用程序将访问该区域。
然而,访问引用将意味着调用程序将直接访问返回值,而不需拷贝。通常,引用将指向传递给函数的引用。
因此调用函数实际上是直接访问自己的一个变量。此例中,sysopref是looper的引用,因此返回值是main()
中的原始looper变量。
copycat = use(looper);
若函数use()返回一个结构,sysopref的内容将被复制到一个临时返回存储单元中,然后该临时返回存储单元
的内容将被直接复制到copycast中,这意味着:返回指向结构的引用比返回结构效率更高!!!
****返回引用的函数实际上是被引用的变量的别名
第三个是使用函数调用来返回结构的成员:
cout << "use(looper): " << use(looper).used << " use(s)\n";
与
use(looper);
cout << "used(looper): " << lopper.used << " use(s)\n";
等效。
表示法use(looper).used访问looper的成员used。若该函数返回一个结构而不是指向结构的引用,则这些代码
访问的将是looper的临时拷贝的used成员。
****返回引用需要注意的问题:
返回引用应避免返回当函数终止时不再存在的内存单元引用。
应避免写下面的代码:
const sysop & clone2(sysop & sysopref)
{
sysop newguy;///first step to big error
newguy = sysopref;
return newguy;
}
该函数返回一个指向临时变量(newguy)的引用,函数运行完毕后,它将不再存在。
****也要避免返回指向临时变量的指针
为避免这种问题,最简单的方法是,返回一个作为参数传递给函数的引用。作为参数的引用将指向调用函数
使用的数据,因此返回的引用也将指向这些数据。
另一种方法是用new来分配新的储存空间。
const sysop & clone(sysop & sysopref)
{
sysop * psysop = new sysop;
*psysop = sysopref;
return *psysop;
}
sysop & jolly = clone(looper);
jolly成为新结构的引用。在不需要new分配的内存时,应使用delete来释放。auto_ptr模板可帮助程序员
自动完成释放工作。
******************************************************************************************
const sysop & use(sysop & sysopref);
const并不意味着结构sysop本身为const,而只意味着不能使用返回的引用来直接修改他指向的结构。
若省略const,则可以:
use(looper).used = 10;
还可以:
sysop newgal = {"Polly Morf", "Polly's not a hacker.",0};
use(looper);
looper = newgal;
省略const后可以编写简短但含义更模糊的代码,增加犯错机会,所以最好将返回类型声明为const.
*/