夏桀_商纣吧 关注:63贴子:2,980
  • 12回复贴,共1

【备忘】函数重载辨析

只看楼主收藏回复

有些看起来不相同的形参本质上是相同的:
Record lookup(const Account &acct);
Record lookup(const Account&);
*******************************
typedef Phone Telno;
Record lookup(const Phone&);
Record lookup(const Telno&);
*******************************
Record lookup(const Phone&, const Name&);
Record lookup(const Phone&, const Name& = "");
*******************************
Record lookup(Phone);
Record lookup(const Phone);



1楼2009-02-17 13:51回复
    引用《函数返回日志》例子:
     const string &shorterString(const string &s1, const string &s2)
     {
     return s1.size() < s2.size() ? s1 : s2;
     }
    你会发现将shorterString写成函数有一个潜在的问题:调用函数比求解等价表达式要慢得多。在大多数机器上,调用函数要做许多工作:调用前要先保存寄存器,并在返回时恢复;复制实参;程序还必须转向一个新位置执行。
    因此,内联函数的出现避免了函数调用的开销。例如:
    cout << shorterString(s1,s2) << endl;
    如果shorterString函数是内联函数,则在编译时展开为:
    cout << (s1.size() < s2.size() ? s1 : s2)
     << endl;
    从而消除了把shorterString写成函数的额外执行开销。
    附录:(shorterString内联函数形式)
     inline const string &shorterString(const string &s1, const string &s2)
     {
     return s1.size() < s2.size() ? s1 : s2;
     }


    2楼2009-02-17 13:51
    回复
      2025-08-26 04:09:51
      广告
      不感兴趣
      开通SVIP免广告
      1.返回非引用类型
      在调用函数的地方会创建一个临时对象,并将函数返回值复制给临时对象。
      例如:
       //程序提供了一个计数器ctr,一个单词word和单词结束字符串ending,当计数器的值不为1时,返回单词的复数版本
       string make_plural(size_t ctr, const string &word, const string &ending)
       {
       return (ctr == 1) ? word : word + ending;
       }
      可以看到,函数要么返回word的副本,要么返回由word和ending相加产生的临时string对象。


      3楼2009-02-17 13:52
      回复
        2.返回引用
        当函数返回引用时,没有复制返回值。相反,返回的是对象本身。例如:
         const string &shorterString(const string &s1, const string &s2)
         {
         return s1.size() < s2.size() ? s1 : s2;
         }
        #注意:不要返回局部对象的引用


        4楼2009-02-17 13:53
        回复
          当函数执行完毕时,将释放分配给局部对象的存储空间。对于局部对象的引用会指向不确定的内存。例如:


          5楼2009-02-17 13:54
          回复
            const string &foo(const string& s)
             {
             string ret = s;
             return ret;
             }


            6楼2009-02-17 13:54
            回复
              $一个习题:思考屏幕打印内容


              7楼2009-02-17 13:55
              回复
                char &get_val(string &str, string::size_type i)
                 {
                 return str[i];
                 }


                8楼2009-02-17 13:55
                回复
                  2025-08-26 04:03:51
                  广告
                  不感兴趣
                  开通SVIP免广告
                  int main()
                   {
                   string s("a value");
                   cout << s << endl;
                   get_val(s,2) = "n";
                   cout << s << endl;
                   return 0;
                   }
                  *********************************************


                  9楼2009-02-17 13:55
                  回复
                    打印[摆渡]结果:
                    a [摆渡]value
                    a [摆渡]nalue


                    10楼2009-02-17 13:56
                    回复
                      熟悉预处理的人对这个4个常量一定不陌生了,不做过多解释:
                       
                      _ _FILE_ _文件名
                      _ _LINE_ _当前行号
                      _ _TIME_ _文件被编译的时间
                      _ _DATE_ _ 文件被编译的日期


                      11楼2009-02-17 13:57
                      回复
                        为什么会存在一个解引用操作符的这么一个同义词:箭头操作符(->)。
                        众所周知,点操作符用于获得类类型对象的成员: 
                         item1.getName(id);
                        如果有一个指向item对象的指针,通过指针的方式调用对象成员前,需要进行解引用:
                         item *pointer = &item1;
                         (*pointer).getName(id);
                        因为解引用操作符的优先级是低于点操作符的,所以必须要使用括号。所以,问题就出现了,程序员总是会疏忽遗漏这个特点。如果括号被遗漏,那么这段代码的含义就大不相同了:
                         *pointer.getName(id);//编译中会发生错误
                        以上代码行就等同于:
                         *(pointer.getName(id));
                        无法编译通过。


                        12楼2009-02-17 13:57
                        回复
                          综上所述, 箭头操作符(->)的出现就是为了避免以上情况:
                           (*pointer).getName(id);
                          等价于:
                           pointer->getName(id);


                          13楼2009-02-17 13:58
                          回复