引用(三)

来源:互联网 发布:机智自动交易软件 编辑:程序博客网 时间:2024/06/05 22:56

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 typeint 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 itconst 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 sPress 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.*/


0 0
原创粉丝点击