习题选自:C++ Primer Plus(第六版)内容仅供参考,如有错误,欢迎指正 !
1.内联函数:与普通函数的区别在于,编译器在处理内联函数的语句的时候,不会将语句编译成函数调用的指令,而是将整个函数的代码插入调用语句处(普通函数在调用的时候需要创建时间、参数传入等操作,会造成时间和空间的额外空间)
优点:不会产生函数调用的开销,提高了效率,减少了一些不必要的开销。
缺点:导致主函数指令增多,可能会增加二进制可执行文件的大小
1. 复习题
1.哪种函数适合定义为内联函数?
只有一行代码的小型、非递归的函数适合作为内联函数。
2假设song()函数的原形如下:
void song(const char * name, int times);
a.如何修改原形,使times的默认值为1?
b.函数定义需要做哪些修改?
c.能否为name提供默认值”O,My Papa”?
a.void song(const char * name, int times = 1);
b.函数定义不需要修改,只有函数原型包含默认信息。
c.可以,void song(char * name ="O,My Papa", int times = 1);
3.编写iquote()的重载版本–显示其用双引号括起的参数,编写3个版本:一个用于int参数,一个用于double参数,另一个用于string参数。
//用于 int 参数voidiquote(intn){cout<<"\""<< n <<"\""<<endl;}//用于 double 参数voidiquote(couble n){cout<<"\""<< n <<"\""<<endl;}//用于 string 参数voidiquote(char* str){cout<<"\""<< str <<"\""<<endl;}
4.下面是一个结构模板:
structbox{charmaker[40];floatheight;floatwidth;floatlength;floatvolume;}
a.请编写一个函数,他将box结构体的引用作为形参,并显示每个成员的值。
b.请编写一个函数,他将box结构的引用作为行参,并将volume成员设置为其他3边的乘积。
a.
voidshowBox(constbox & b){cout<<"maker : "<< b.maker <<endl;cout<<"height : "<< b.height <<endl;cout<<"width : "<< b.width <<endl;cout<<"length : "<< b.length <<endl;cout<<"volume : "<< b.volume <<endl;}
b.
voidsetVolume(box & b){b.volume = b.height * b.width * b.length;}
5.为让函数fill()和show()使用引用参数,需要对程序清单7.15做哪些修改?
修改后的代码:
include include include constintSeasons =4;conststd::array<std::string, Seasons> Snames ={"Spring","Summer","Fall","Winter"};voidfill(std::array<double, Seasons> &pa);voidshow(conststd::array<double, Seasons> &da);intmain(){std::array<double, 4> expenses;fill(expenses);show(expenses);return0;}voidfill(std::array<double, Seasons> &pa){for(inti =0; i < Seasons; i++){std::cout<<"Enter "<< Snames[i] <<" expenses: ";std::cin>> pa[i];}}voidshow(conststd::array<double, Seasons> &da){doubletotal =0.0;std::cout<<"\nEXPENSES\n";for(inti =0; i < Seasons; i++){std::cout<< Snames[i] <<": $"<< da[i] <<\n;total += da[i];}std::cout<<"Total: $"<< total <<\n;}
6.指出下面每个目标是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。
a. mass(density,volume)返回密度为density、体积为volume的物体的质量,而mass(density)返回密度为density、体积为1.0立法米的物体的质量。这些值的类型都为double。
b. repeat(10,”Im OK”)将指定的字符串显示10次,而repeat(“But youre kind of stupid”)将指定的字符串显示5次。
c. average(3,6)返回两个int参数的平均值(int类型),而average(3.0,6.0)返回两个double值的平均值(double类型)。
d. mangle(“Im glad to meet you”)根据是将值赋给char变量还是char*变量,分别返回字符1和指向字符串Im glad to meet you的指针。
a.
//既可以使用默认参数,又可以使用函数重载//1.默认参数doublemass(doubledensity,doublevolume =1.0);//2.函数重载doublemass(doubledensity,doublevolume);doublemass(doubledensity);
b.
//不能使用默认参数,因为使用默认值必须从右到左提供默认值//函数重载voidrepeat(inttimes,constchar* str);voidrepeat(constchar* str);
c.
//函数重载intaverage(inta,intb);doubleaverage(doublea,doubleb);
d.两种方法都不能完成,需分成两个不同的函数实现。
7.编写返回两个参数中较大值的函数模板。
代码实现:
template<classT>Tmax(Tt1,Tt2){returnt1 > t2 ? t1 : t2;}
8.给定复习题6的模板和复习题4的box结构,提供一个模板具体化,它接受两个box参数,并返回体积较大的一个。
代码实现:
template<>boxmax(box b1, box b2){returnb1.volume > b2.volume ? b1 : b2;}
9.在下述代码(假定这些代码是一个完整程序的一部分)中,v1、v2、v3、v4和v5分别是哪种类型?
intg(intx);....floatm =5.5f;float&rm = m;decltype(m)v1 = m;decltype(rm)v2 = m;decltype((m)) v3 = m;decltype(g(100))v4;decltype(2.0*m)v5;
decltype(m)v1 = m;//类型为floatdecltype(rm)v2 = m;//类型为float &decltype((m)) v3 = m;//类型为float &decltype(g(100))v4;//类型为intdecltype(2.0*m)v5;//类型为double
编程练习
1. 编写通常接受一个参数(字符串的地址),并打印该字符串的函数。然而,如果提供了第二个参数(int类型),且该参数不为0,则该函数打印字符串的次数将为该函数被调用的次数(注意,字符串的打印次数不等于第二个参数的值,而等于函数被调用的次数)。是的,这是一个非常可笑的函数,但它让您能够使用本章介绍的一些技术。在一个简单的程序中使用该函数,以演示该函数是如何工作的。
代码实现:
include usingnamespacestd;intmyShowStr(char* str,intprintTimes);intmain(){charmystr[50] ="Hello,world!";myShowStr(mystr,5);return0;}intmyShowStr(char* str,intprintTimes){if(printTimes >1){cout<< str <<endl;printTimes--;myShowStr(str, printTimes);}else{cout<< str <<endl;}returnprintTimes;}
2. CandyBar结构包含3个成员,第一个成员存储candy bar的品牌名称;第二个成员存储candy bar的重量(可能有小数);第三个成员存储candy bar的热量(整数)。请编写一个程序,它使用一个这样的函数,即将CandyBar的引用、char指针、double和int作为参数,并用最后3个值设置相应的结构成员。最后3个参数的默认值分别为Millennium Munch、2.85和350。另外,该程序还包含一个以CandyBar的引用为参数,并显示结构内容的函数。请尽可能使用const。
代码实现:
include usingnamespacestd;defineDEFAULT_BRAND (char*)"Millennium Munch"structCandyBar{char* brand;doubleweight;intheat;};voidsetCandyBar(CandyBar& candyBar,char* brand = DEFAULT_BRAND,doubleweight =2.85,intheat =350);voiddisplay(constCandyBar& candyBar);intmain(){CandyBar cb,cb1;setCandyBar(cb1);setCandyBar(cb, (char*)"MJJ",3.55,120);display(cb);display(cb1);return0;}voidsetCandyBar(CandyBar& candyBar,char*brand,doubleweight,intheat){candyBar.brand = brand;candyBar.weight = weight;candyBar.heat = heat;}voiddisplay(constCandyBar& candyBar){cout<<"BRAND : "<< candyBar.brand <<endl;cout<<"WEIGHT : "<< candyBar.weight <<endl;cout<<"HEAT : "<< candyBar.heat <<endl;}
3. 编写一个函数,它接受一个指向string对象的引用作为参数,并将该string对象的内容转化成大写,为此可以使用表6.4描述的函数toupper()。然后编写一个程序,它通过使用一个循环让您能够用不同的输入来测试这个函数,该程序的运行如下:
Enter a string (q to quit):go away
GO AWAY
Enter a string (q to quit):good grief!
GOOD GRIEF!
Enter a string (q to quit):q
Bye.
代码实现:
include include usingnamespacestd;voidConversion(string& str);intmain(){stringstr;cout<<"Enter a string(q to quit): ";while(getline(cin,str) && str !="q"){Conversion(str);cout<< str <<endl;cout<<"Next string(q to quit): ";}cout<<"Bye."<<endl;return0;}voidConversion(string& str){intsize = str.size();for(inti =0; i < size; i++){str[i] =toupper(str[i]);}}
4.下面是一个程序框架:
include include usingnamespacestd;structstringy{char* str;intct;};intmain(){stringy beany;chartesting[] ="Reality isnt what it used to be.";set(beany, testing);show(beany);show(beany,2);testing[0] =D;testing[1] =u;show(testing);show(testing,3);show("Done!");return0;}
请提供其中描述的函数和原型,从而完成该程序。注意,应有两个show()函数,每个都使用默认参数。请尽可能使用const参数。set()使用new分配足够的空间来存储指定的字符串。这里使用的技术与设计和实现类时使用的相似。(可能还必须修改头文件的名称,删除using编译指令,这取决于所用的编译器)。
代码实现:
include include usingnamespacestd;structstringy{char* str;intct;};voidset(stringy& stry,constchar* test);voidshow(conststringy& stry,intshowTimes =1);voidshow(constchar* ch,intshowTimes =1);intmain(){stringy beany;chartesting[] ="Reality isnt what it used to be.";set(beany, testing);show(beany);show(beany,2);testing[0] =D;testing[1] =u;show(testing);show(testing,3);show("Done!");return0;}voidset(stringy& stry,constchar* test){stry.ct =strlen(test);stry.str =newchar[stry.ct];strcpy(stry.str, test);}voidshow(conststringy& stry,intshowTimes){for(inti =0; i < showTimes; i++){cout<< stry.str <<endl;}}voidshow(constchar* ch,intshowTimes){for(inti =0; i < showTimes; i++){cout<< ch <<endl;}}
5.编写模板函数max5(),它将一个包含5个T类型元素的数组作为参数,并返回数组中最大的元素(由于长度固定,因此可以在循环中使用硬编码,而不必通过参数来传递)。在一个程序使用该函数,将T替换为一个包含5个int值的数组和一个包含5个double值的数组,以测试该函数。
代码实现:
include usingnamespacestd;template<typenameT>Tmax5(T *t);intmain(){intarr1[5] = {5,3,5,9,6};doublearr2[5] = {5.2,3.1,6.8,10.8,7.1};cout<<"arr1 max num : "<< max5(arr1) <<endl;cout<<"arr2 max num : "<< max5(arr2) <<endl;return0;}template<typenameT>Tmax5(T* t){T maxValue = t[0];for(inti =1; i <5; i++){if(maxValue < t[i]){maxValue = t[i];}}returnmaxValue;}
6.编写模板函数maxn(),他将由一个T类型元素组成的数组和一个表示数组元素数目的整数作为参数,并返回数组中最大的元素。在程序对它进行测试,该程序使用一个包含6个int元素的数组和一个包含4个都不了元素的数组来调用该函数。程序还包含一个具体化,他将char指针数组和数组中的指针数量作为参数,并返回最长的字符串的地址。如果有多个这样的字符串,则返回其中第一个字符串的地址。使用由5个字符串指针组成的数组来测试该具体化。
代码实现:
include include usingnamespacestd;template<typenameT>Tmaxn(T* t,intn);template<>char*maxn(char* pch[],intn);intmain(){intarr1[6] = {5,3,5,9,6,11};doublearr2[4] = {5.2,3.1,2.8,4.8};charconst* arr3[5] = {"abcde","abcdef","abc","ab","abcdefg"};cout<<"arr1 max num : "<< maxn(arr1,6) <<endl;cout<<"arr2 max num : "<< maxn(arr2,4) <<endl;cout<<"arr3 max len : "<< maxn(arr3,5) <<endl;return0;}template<typenameT>Tmaxn(T* t,intn){T maxValue = t[0];for(inti =1; i < n; i++){if(maxValue < t[i]){maxValue = t[i];}}returnmaxValue;}template<>char*maxn(char* pch[],intn){automaxLen =strlen(pch[0]);intindex =0;for(inti =1; i < n; i++){if(maxLen <strlen(pch[i])){maxLen =strlen(pch[i]);index = i;}}returnpch[index];}
7.修改程序清单8.14,使其使用两个名为SumArray()的模板函数来返回数组元素的总和,而不是显示数组的内容。程序应显示thing的总和以及所有debt的总和。
/******************程序清单8.14******************/// tempover.cpp --- template overloadinginclude
template<typenameT>// template AvoidShowArray(T arr[],intn);template<typenameT>// template BvoidShowArray(T * arr[],intn);structdebts{charname[50];doubleamount;};intmain(){usingnamespacestd;intthings[6] = {13,31,103,301,310,130};structdebtsmr_E[3] ={{"Ima Wolfe",2400.0},{"Ura Foxe",1300.0},{"Iby Stout",1800.0}};double* pd[3];// set pointers to the amount members of the structures in mr_Efor(inti =0; i <3; i++)pd[i] = &mr_E[i].amount;cout<<"Listing Mr. Es counts of things:\n";// things is an array of intShowArray(things,6);// uses template Acout<<"Listing Mr. Es debts:\n";// pd is an array of pointers to doubleShowArray(pd,3);// uses template B (more specialized)// cin.get();return0;}template<typenameT>voidShowArray(T arr[],intn){usingnamespacestd;cout<<"template A\n";for(inti =0; i < n; i++)cout<< arr[i] <<;cout<<endl;}template<typenameT>voidShowArray(T * arr[],intn){usingnamespacestd;cout<<"template B\n";for(inti =0; i < n; i++)cout<< *arr[i] <<;cout<<endl;}
代码实现:
include template<typenameT>TSumArray(T arr[],intn);template<typenameT>TSumArray(T * arr[],intn);structdebts{charname[50];doubleamount;};intmain(){usingnamespacestd;intthings[6] = {13,31,103,301,310,130};structdebtsmr_E[3] ={{"Ima Wolfe",2400.0},{"Ura Foxe",1300.0},{"Iby Stout",1800.0}};double* pd[3];for(inti =0; i <3; i++)pd[i] = &mr_E[i].amount;cout<<"sum of things : "<< SumArray(things,6) <<endl;cout<<"sum of debts :"<< SumArray(pd,3) <<endl;;return0;}template<typenameT>TSumArray(T arr[],intn){T sum =0;for(inti =0; i < n; i++){sum = sum + arr[i];}returnsum;}template<typenameT>TSumArray(T * arr[],intn){T sum =0;for(inti =0; i < n; i++){sum = sum + *arr[i];}returnsum;}
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容