跳转至

复习题

第 8 章 函数探幽 复习题

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

    函数代码量小,运算量小的适合使用内联函数。

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

    void song(const char *name,int times);
    
    a. 如何修改原型,使times的默认值为1?
    b. 函数定义需要做哪些修改?
    c. 能否为name提供默认值 “O,My Papa”?
    1
    2
    3
    void song(const char *name,int times= 1); //a
    none //b
    void song(const char *name = "o,my Papa",int times = 1); //c
    

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

    #include <iostream>
    #include <cstring>
    using namespace std;
    void iqoute(int n)
    {
        cout<<"\""<<n<<endl;
    }
    void iqoute(double d)
    {
        cout<<"\""<<d<<endl;
    }
    void iqoute(string str)
    {
        cout<<"\""<<str<<endl;
    }
    

  4. 下面是一个机构模板:

    1
    2
    3
    4
    5
    6
    7
    8
    struct box
    {
        char maker[40];
        float height;
        float width;
        float length;
        float volume;
    }
    
    a. 编写一个函数,它将box的结构的引用作为形参,并显示每个成员的值。
    b. 编写一个函数,它将box的结构的引用作为形参,并将volume成员设置为其他3边的乘积。
    using namespace std;
    struct box
    {
        char maker[40];
        float height;
        float width;
        float length;
        float volume;
    }
    // a
    void show_box(const box &box_a)
    {
        cout << "Maker : "<<box_a.maker<<endl;
        cout << "height : "<<box_a.height<<endl;
        cout << "width : "<<box_a.width<<endl;
        cout << "length : "<<box_a.length<<endl;
        cout << "volume : "<<box_a.volume<<endl;
    }
    // b
    void set_volume(box &box_b)
    {
        box_b.volume = box_b.height * box_b.width * box_b.length;
    }
    

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

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

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

1
2
3
4
double mass(double density,double volume = 1.0);
overload:
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次。
1
2
3
overload:
void repeat(int times,const char *str);
void repeat(const char *str);

c. average(3,6)返回两个int参数的平均值(int类型),而average(3.0,6.0)返回两个double值的平均值(double类型)。

int average(int a,int b);
double average(double a,double b);

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

函数的特征标相同,所以不可以

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

    1
    2
    3
    4
    5
    template <typename T>
    T max(T t1,T t2)
    {
        return t1>t2?t1:t2;
    }
    

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

    1
    2
    3
    4
    template <> box max (box b1,box,b2)
    {
        return b1.volume>b2.volume?b1:b2;
    }
    

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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类型