• 练习6.16、6.17、6.19、6.20


    6.16:下面这个函数虽然合法,但是不算特别有用。指出它的局限性并设法改善。

    bool is_empty(string& s)  {  return s.empty(); }

    Ans:局限性:不能直接传给形参一个字符串字面值,并且函数中并没有修改s,形参应该设置为const引用。

       改善:bool is_empty(const string& s)  {  return s.empty(); }

    6.17:编写一个函数,判断string对象中是否含有大写字母。编写一个函数,把string对象全部都改成小写形式。在这两个函数中你使用的形参类型相同吗?为什么?

    Ans:由于使用的是string对象,前者我形参类型为常量引用,后者为普通引用。由于前者只是判断是否有大写字母,不需要修改string对象,所以使用常量,使用引用是为了避免string对象太长,不利于拷贝,后者使用普通引用是由于要将大写字母转换成小写字母,故不能使用常量引用。

    6.19:假定有如下声明,判断哪个调用合法、哪个调用不合法。对于不合法的函数调用,说明原因。

    double calc(double);

    int count (const string &, char);

    int sum( vector<int>::iterator, vector<int>::iterator, int);

    vector<int> vec(10);

    (a)calc(23.4 , 55.1);  (b) count ("abcda",‘a’ );

    (c)calc(66);      (d)sum(vec.begin() ,vec.end(), 3.8);

    Ans:a)非法调用。函数声明的形参个数只有一个,但是函数调用中却有2个实参,实参与形参要一一对应。

       b)合法。函数调用中第一个实参是字符串常量字面值,第二个实参是一个字符,而函数声明中形参第一个是常量引用,第二个是char类型,一一对应,类型匹配,故合法。

       c)合法。参数个数对应,并且实参是int类型,可以转换成double类型,初始化形参。

       d)合法。参数个数对应,前两个类型匹配,但是最后一个参数,double类型转换成int类型,会出现数据丢失。

    6.20:引用形参什么时候应该是常量引用?如果形参应该是常量引用,而我们将其设为了普通引用,会出现什么情况?

    Ans:当函数中形参参与的操作不需要修改引用类型的形参时,就应该使用常量引用。

    会出现很多的局限性,不能将常量引用作为实参去初始化形参,也不能用字符串字面值去初始化形参,否则编译器会报错。并且也不能将需要类型转换的对象传给形参。

  • 相关阅读:
    记一次centos 服务器中毒事件
    heatmap
    this
    购物车
    带标签的无缝轮播
    无缝轮播
    图片滚动百分百宽度
    选择排序
    冒泡排序
    tab标签页
  • 原文地址:https://www.cnblogs.com/Dark-King/p/9477050.html
Copyright © 2020-2023  润新知