C++primer plus 习题+答案

这篇具有很好参考价值的文章主要介绍了C++primer plus 习题+答案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第八章

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

解释:      

          一般来说,调用一个函数流程为:当前调用命令的地址被保存下来,程序将跳转到所调用的函数并执行该函数,最后跳转回之前所保存的命令地址。

        对于经常需要调用的小函数来说,这大大降低了程序运行效率。所以,新增了内联函数。

        关键字inline告诉编译器,任何地方只要调用内联函数,就直接把函数的机器码插入到调用它的地方。这样程序执行更有效率,就好像将内联函数中的语句直接插入到了源代码文件中需要调用该函数的地方一样。

适合于:

        只有一行代码的小型,非递归函数适合作为内联函数。

2.假设song()函数的原型如下:

void song(const char *name, int times);

a.如何修改原型,使times的默认值为1?

void song(const char*name, int times = 1);

b.函数定义需要做哪些修改?

没有,只有原型包含默认值的信息。

c.能否为name提供默认值"O. My Papa" ?

是的,如果保留times的默认值

3.编写iquote()的重载版本——显示其用双引号括起的参数。编写3个版本:一个用于int参数,一个用于double参数,另一个用于String参数

void iquote(int n)

{

    std::cout << "\"" << n << "\"" << std::endl;

}文章来源地址https://www.toymoban.com/news/detail-456008.html

void iquote(double n)

{

    std::cout << "\"" << n << "\"" << std::endl;

}

void iquote(std::string n)

{

    std::cout << "\"" << n << "\"" << std::endl;

}

int main() {

    iquote(4);

    iquote(0.9);

    iquote("sfd");

    return 0;

}

4.下面是一个结构模板;

struct box

{

        char maker[40];

        float height;

        float width;

        float length;

        float volume;

};

a.请编写一个函数,它将box结构的引用作为形参,并显示每个成员的值。

b.请编写一个函数,它将box结构的引用作为形参,并将volume成员设置为其他3边的乘积。

struct box

{

    char maker[40];

    float height = 20;

    float width;

    float length;

    float volume;

};

void show (box &b)

{

    std::cout << b.height << std::endl;

}

void set_volume(box & c)

{

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

}

int main() {

    box c;

    show(c);

    set_volume(c);

    return 0;

}

5.为让函数fill()和show()使用引用形参,需要对程序做哪些修改?

6.指出下面每个目标是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。

函数默认值:

(1)参数默认值必须从右向左依次赋值

(2)函数的默认值不可以重复赋值

a. mass(density, volume)返回密度为density,体积为volume的物体的质量,而mass(density)返回密度为density,体积为1.0立方米的物体的质量。这些值的类型都为double。

//函数默认值

double mass(double density, double volume = 1.0);

//函数重载

double mass(double density, double volume);

double mass(double density);

b.repeat(10, "I'm OK")将指定的字符串显示10次,而repeat(“But you're kind of stupid”)将指定的字符串显示5次。

因为函数必须从右向左提供默认值,因此本题无法使用默认值,只能使用函数重载实现

void repeat(int count, std::string s );

void repeat(std::string s);

c.mangle("I'm glad to meet you")根据是将值赋给char变量还是char*变量,分别返回字符1和指向字符串“I'm mad to gleet you” 的指针。

不能这样做,因为两个版本的特征标将相同

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

template<class T>

T max(const T &t1, const T &t2)

{

    return t1 > t2 ? t1 : t2;

}

8.给定复习题6的模板和复习题4的box结构,提供一个模板具体化,它接受两个box参数,并返回体积较大的一个。

//模板的原型声明

template<typename T> T bigger(T, T);

//模板的具体化声明

template<> box bigger<box>(box , box);


 

//模板函数具体化实现

template<> box bigger<box>(box x, box y)

{

    return x.volume > y.volume ? x : y;

}


 

int main() {

    box a;

    box b;

    a.volume = 10;

    b.volume = 20;

    std::cout << bigger(a, b).volume;    

    return 0;

}

9.在下述代码(假定这些代码是一个完整程序的一部分)中,v1,v2,v3,v4和v5分别是哪种类型?

定义:

decltype(exp) varname = value;        //根据exp的类型来推测varname的类型和 = 右边无关

如果exp一个左值,或者被括号()包围,那么decltype(exp)的类型就是exp引用,假设exp类型为T,那么decltype(exp)的类型就是T&

int g(int x);

float m = 5.5f;

float& rm = m;

decltype(m) v1 = m;                

float

decltype(rm) v2 = m;

float &

decltype((m)) v3 = m;

float &

decltype(g(100)) v4;

int

decltype(2.0 * m)  v5;

2.0为double类型,所以为double类型

10.用模板函数来求数组最小值 

template<typename T> T max5(T[]);

template<typename T> T max5(T st[])

{

    T maxx = st[0];

    for (int i = 0; i < 5; i++)

    {

        maxx = max(st[i], maxx);

    }

    return maxx;

}

int main() {

    int arr[5] = {1, 2, 3, 4, 5};

    cout << max5(arr);

    return 0;

}

11. 编写模板函数maxn(),它以由一个T类型元素组成的数组和一个表示数组元素数目的整数作为参数,并返回数组的最大的元素。该程序使用一个包含6个int元素的数组和一个包含4个double元素的数组来调用该函数。程序还包含一个具体化,它以char指针数组和数组中的指针数量作为参数,并返回最长的字符串的地址。如果有多个这样的字符串,则返回其中第一个字符串的地址。使用由5个字符串指针组成的数组来测试该具体化。

//模板参数的声明和模板的具体化声明

template<typename T> T maxn(T [], int);

template<> char*maxn<char*>(char*[], int);

//定义模板函数

template<typename T> T maxn(T arr[], int length)

{

    return arr[length - 1];

}

//定义模板函数

template<> char*maxn<char*>(char *st[], int length)

{

    int pos = 0;

    for (int i = 0; i < length; i++)

    {

        if(strlen(st[pos]) < strlen(st[i])) pos = i;

    }

    return st[pos];

}

int main() {

    int arr[5] = {1, 2, 3, 4, 5};

    char *s[] = {"hello", "world"};

    cout << maxn(s, 2);

    return 0;

}

到了这里,关于C++primer plus 习题+答案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ primer plus第七章编程练习答案

    1.编写一个程序,不断要求用户输入两个数,直到其中的一个为 0。对于每两个数,程序将使用一个南数来计算它们的调和平均数,并将结果返回给 main(),而后者将报告结果。调和平均数指的是倒数平均值的倒数,计算公式如下: 调和平均数=2.0*xy/(x + y) 2.编写一个程序,要求用

    2024年02月10日
    浏览(32)
  • C++ Primer Plus第五章编程练习答案

    答案仅供参考,实际运行效果取决于运行平台和运行软件 1.编写一个要求用户输入两个整数的程序。该程序将计算并输出这两个整数之间包括这两个整数)所有整数的和。这里假设先输入较小的整数。例如,如果用户输入的是2和则程序将出29之间所有整数的和为44 2.使用array对

    2024年02月09日
    浏览(40)
  • C Primer Plus第十六章编程练习答案

    学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 由于使用的是命令行参数常用于linux系统或者vscode,但此代码是运行于vs2022的,测试截图就不弄了。

    2024年02月07日
    浏览(32)
  • C Primer Plus第十四章编程练习答案

    学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 由于使用的是命令行参数常用于linux系统或者vscode,但此代码是运行于vs2022的,测试截图就不弄了。

    2024年02月07日
    浏览(47)
  • 【C++ Primer(第5版) 课后习题题目及答案 第一章】

    我使用的是VS2022,命令行可以输入 cl 文件名 可以在当前目录下生成.exe文件,然后双击打开即可运行。 在Windows操作系统下main函数没有报告运行失败,因此返回0或-1在运行效果没有什么区别。 错误代码 不合法 第5行和第6行代码最后分别有一个分号,表示语句结束。而第6行和

    2024年02月01日
    浏览(33)
  • C++ Primer第五版_第九章习题答案(51~52)

    练习9.51 设计一个类,它有三个unsigned成员,分别表示年、月和日。为其编写构造函数,接受一个表示日期的string参数。你的构造函数应该能处理不同的数据格式,如January 1,1900、1/1/1990、Jan 1 1900 等。

    2023年04月11日
    浏览(34)
  • 【C++】C++ primer plus第二章练习题

    c++程序的模块叫什么? 函数。 下面的预处理器编译指令是做什么用的? 包含头文件,将iostream文件的内容添加·到代码中 下面的语句是做什么用的? using namespace std; using是预编译器指令,让其使用std命名空间 什么语句可以用来打印短语“Hello, world”,然后开始新的一行? s

    2024年02月06日
    浏览(40)
  • C++ Primer第五版_第十四章习题答案(41~50)

    练习14.41 你认为 C++ 11 标准为什么要增加 lambda?对于你自己来说,什么情况下会使用 lambda,什么情况下会使用类? 使用 lambda 是非常方便的,当需要使用一个函数,而这

    2024年02月01日
    浏览(29)
  • C++ Primer第五版_第十八章习题答案(11~20)

    练习18.11 为什么 what 函数不应该抛出异常? what中如果抛出异常,需要try catch捕获,再调用what,一直循环,直达内存耗尽。 练习18.12 将你为之前各章练习编写的程序放置在各自的命名空间中。也就是说,命名空间chapter15包含Query程序的代码,命名空间chapter10包含TextQuery的代码

    2024年02月06日
    浏览(33)
  • C++ Primer第五版_第十六章习题答案(41~50)

    练习16.41 编写一个新的 sum 版本,它返回类型保证足够大,足以容纳加法结果。 练习16.42 对下面每个调用,确定 T 和 val

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包