每日九问8c++-函数探幽

每日九问8c+±函数探幽

1.哪种函数适合定义为内联函数?

解析:
内联函数是一种特殊的函数,其主要特点是在进行源代码编译时,C++编译器使用内联函数的代码替换函数的调用语句,这样程序在运行中将不需要执行类似于常规函数的复杂操作,因此可以节省大量的系统资源,提高程序的执行效率。对于常规函数,在程序进行函数调用时,需要进行一系列复杂的操作,包括函数地址查询、地址保存、函数参数复制、程序代码跳转、执行函数代码、函数代码执行完毕后返回原始代码中的地址等。
通常情况下,程序设计中代码较简单的非递归函数可以使用内联函数。内联函数使用关键字 inline。但是考虑到现代编译器的具体优化特性,原始代码中的内联函数会在编译器过程中有选择地进行内联优化。

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);o
b.函数默认值只需要在声明处表示,在函数的定义处不需要标注参数默认值。1
c.可以为name 提供默认值,但是在为 name 提供默认值时,必须也要保持 times 的默认值,因为默认值必须从右向左排列,不能 name 在参数列表左侧有默认值,而 times 在右侧但是没有默认值。

3.编写iquote()的重载版本—显示它用双引号括起来的参数。编写3个版本。其中,一个用于 int 参数,另一个用于 double 参数,最后一个用于 string 参数。
解析:
在函数的重载中函数名相同但是函数的参数列表不同,因此本题中的重载如下。

void iquote(int n)

{

cout<<“”“<<n<<”“”<<endl;

}

void iquote(double d)
{
cout<<“”\“<<d<<”\“”<<endl;
}
void iquote(string s)
{
cout<<“\]”“<<s<<”\“”<<endl;
}

4.下面是一个结构体模板。

struct box

{
char maker[40];

float height;

float width;

float length;

float volume;
};
a.请编写一个函数,它以 box 结构体的引用作为形参,并显示每个成员的值。
b.请编写一个函数,它以 box 结构体的引用作为形参,并将 volume 成员设置为他3条边的乘积。

解析:
C++中的引用变量主要应用于函数的形参。若以引用变量作为函数的形参,函数在执行过程中将使用实参的原始数据而不是其副本。本题可以这样定义引用参数。
void show box(box& b)

{

cout<<“The Box information:\n”<<"Maker: "<<b.maker<<end1;

cout<<"Height: "<<b.height<<endl;

cout<<"width: "<<b.width <<endl;

cout<<"Length: "<<b.length <<endl;

cout<<"Volume: "<<b.volume <<endl;

}

void clac volume(boxs b)

{

b.volume = b.height *b.width *b.length;

}

5.为了使函数 fill0和 showO以引用作为参数,需要对程序清单 7.15 做哪些修改?

解析:
程序清单 7.15 中的函数 fill0和show0函数分别以指针与数组变量作为函数参数,为了将函数参数修改为引用,首先应当在 show(函数的参数列表中使用 const 关键字,此外,当指针和引用在函数内表示元素时,代码需要略做修改。完整代码如下。

#include

linclude
#include
//常量数据
const int Season=4;
const std::array<std::string, Season> Sname =
{“Spring”,“Summer”,“Fall”,“Winter”}; D
//修改数组对象的函数
void fill(std::array<double, Season>& da);
//使用数组对象的函数,不修改它
void show(const std::array<double, Season>& da);
int main()

{
std::array<double, Season> expenses;

fill(expenses);

show(expenses);

return 0;

}

void fill(std::array<double, Season> &da)

{

using namespace std;
for(int i=0;i<Season;i++)
cout<<“Enter “<< Sname[i] <<” expenses:”;

cin>>da[i];

}

}

/为了使 fil1()函数以引用作为参数,主要修改了数组元素的表示/

void show(const std::array<double, Season> &da)

{

using namespace std;

double total =0.0;

cout<<“\nEXPENSES\n”;
for(int i = 0; i < season; i++)

{

cout<< Sname[i] <<"😒 "<<da[i]<<endl;

total += da[i];

}

cout<<"Total Expenses:$ "<<total<<endl

}

/为了使 show ()函数以引用作为参数,不需要函数实现/

6.指出下面每个功能是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。
a.mass(density, volume)返回密度为 density、体积为 volume 的物体的质量,而 mass(denstity)
返回密度为 density、体积为 1.0m³的物体的质量。这些值的类型都为 double。
b.repeat(10,“I’m OK”)将指定的字符串显示 10 次,而 repeat(“But you’re kind of stupid”
将指定的字符串显示5次。
c.average(3,6)返回两个int 参数的平均值(int 类型),而 average(3.0,6.0)返回两个 double
值的平均值(double 类型)。
d. mangle(“I’m glad to meet you”)根据是将值赋给 char 变量还是 char*变量,分别返回字符I和指向字符串“I’m mad to gleet you”的指针。
解析:
a.可以通过参数默认值实现这两个功能,也可以通过函数的重载来实现这个功能。
函数默认值方式如下。
double mass(double density, double volume = 1.0);函数重载方式如下。
double mass(double density);
double mass(double density, double volume);
b.由于函数必须从右向左提供默认值,因此本题无法使用默认值,只能够使用函数的重载实现。

void repeat(int n, char* str); void repeat(char* str);
c.题目中两个函数的参数类型不同,可以通过函数重载实现。
int average(int x, int y):
double average(double x, double y);
d.这样的函数的特征标相同,因此无法实现函数的重载。此外,对于函数 mangle(“T’m
glad to meet you”), 返回的字符T’和指向字符串"I’m glad to meet you"的指针都是char*类型,即返回值也相同。
7.编写返回两个参数中较大值的函数模板。习题解析:
函数模板是实现泛型编程的一个重要形式。函数模板的基本定义方式如下。 template T Function Name(T t);
其中,typename 也可以用旧标准下的 class 替代。题目要求实现返回较大值的函数,因此函数的定义如下。
template
AnyType Bigger (const AnyType & x, const AnyType &y)l return x>y? x:y;
或者
template
T Bigger (const T & x, const T & y){ return x>y? x:y;}

8.给定复习题6的模板和复习题4的box结构体,实现一个模板的具体化,它接受两个box参数,并返回体积较大的一个。
习题解析:
box结构体的定义及其他相关模板的定义如下。 struct box{
char maker[40]; float height; float width; float length; float volume;
i
当比较 box 对象的大小时,无法使用结构体对象直接进行比较,即无法使用 box1>box的形式比较。按照题意应当选择体积进行比较,因此应当进行模板的具体化。模板的具化需要在原有模板函数的基础上,具体化特定类型的实现。下列是完整版本。
template T& bigger(T&, T&);//模板函数的原型声明 void repeat(int n, char* str); void repeat(char* str);
c.题目中两个函数的参数类型不同,可以通过函数重载实现。
int average(int x, int y):
double average(double x, double y);
d.这样的函数的特征标相同,因此无法实现函数的重载。此外,对于函数 mangle(“I’m glad to meet you”), 返回的字符T’和指向字符串"I’m glad to meet you"的指针都是char*类型,即返回值也相同。

7.编写返回两个参数中较大值的函数模板。

解析:
函数模板是实现泛型编程的一个重要形式。函数模板的基本定义方式如下。 template T Function Name(T t);
其中,typename 也可以用旧标准下的 class 替代。题目要求实现返回较大值的函数,因此函数的定义如下。
template
AnyType Bigger (const AnyType & x, const AnyType &y){

return x>y? x:y;

}

或者
template
T Bigger (const T & x, const T & y){

return x>y? x:y;

}

8.给定复习题6的模板和复习题4的box结构体,实现一个模板的具体化,它接受两个box参数,并返回体积较大的一个。
解析:
box结构体的定义及其他相关模板的定义如下。 struct box{

char maker[40];

float height;

float width;

float length;

float volume;
};
当比较 box 对象的大小时,无法使用结构体对象直接进行比较,即无法使用 box1>box的形式比较。按照题意应当选择体积进行比较,因此应当进行模板的具体化。模板的具化需要在原有模板函数的基础上,具体化特定类型的实现。下列是完整版本。
template T& bigger(T&, T&);

//模板函数的原型声明

template<> box& bigger(box&, box&);//模板的具体化声明
template T6 bigger(T& x, TG y)
return x>y?x:y;
/
//模板函数的实现
template<> boxs bigger(boxs x, box& y)l 率哈回亚,("uoy jsam os bait
return x.volume > y.volume? x:y;//使用体积代替 box 对象从整体上比较大小
//模板函数具体化的实现

9.在下述代码(假定这些代码是一个完整程序的一部分)中,v1、v2、v3、v4 和 v5 分别是哪种类型?
int g(int x);
float m =5.5f;

float& rm =m;
decltype(m)v1 =m;

decltype(rm)v2=m;

decltype((m)) v3=m;

decltype(g(100))v4;

decltype(2.0m) v5;

解析:
由于 C++语言使用了模板函数和模板类,因此声明中经常会发生需要使用中间变量但是因为模板中类型的不确定性而无法明确给出类型定义的情况。为了解决这个问题,C++中使用 decltype 关键字来动态地进行变量的声明。
本题的解答如下。
● 在decltype(m)v1=m;中,变量v1的类型和m相同,为 float 类型。od个 在decltype(rm)v2 = m; 中,变量 v2 的类型和 rm 相同,为 float&类型。● 在decltype((m))v3 = m;中,表达式(m)是一个左值,因此变量v3的类
型是指向m的引用,即 float&。 zod
● 在decltype(g(100))v4;中,表达式是一个函数调用,因此 v4 的类型与函
数返回值相同,为 int 类型。
在 decltype(2.0*m)v5;中,变量m是float 类型,2.0是 double 类型,运算中类型升级,表达式的类型为 double 类型,因此 v5 为 double 类型。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值