📜  函数重载和const关键字

📅  最后修改于: 2021-05-30 10:58:29             🧑  作者: Mango

预测以下C++程序的输出。

#include
using namespace std;
  
class Test
{
protected:
    int x;
public:
    Test (int i):x(i) { }
    void fun() const
    {
        cout << "fun() const called " << endl;
    }
    void fun()
    {
        cout << "fun() called " << endl;
    }
};
  
int main()
{
    Test t1 (10);
    const Test t2 (20);
    t1.fun();
    t2.fun();
    return 0;
}

输出:上面的程序编译并运行良好,并产生以下输出。

fun() called
fun() const called

两种方法’void fun()const’和’void fun()’具有相同的签名,除了一个是const而另一个不是。另外,如果我们仔细看一下输出,会发现在const对象上调用了“ const void fun()”,而在非const对象上调用了“ void fun()”。
C++允许根据const类型重载成员方法。当函数返回引用或指针时,基于const类型的重载可能会很有用。我们可以使一个函数const返回一个const引用或const指针,另一个非const函数另一个返回非const引用或指针。有关更多详细信息,请参见此内容。

参数呢?
与const参数有关的规则很有趣。让我们首先看下面的两个例子。程序1编译失败,但是程序2编译并运行正常。

// PROGRAM 1 (Fails in compilation)
#include
using namespace std;
  
void fun(const int i)
{
    cout << "fun(const int) called ";
}
void fun(int i)
{
    cout << "fun(int ) called " ;
}
int main()
{
    const int i = 10;
    fun(i);
    return 0;
}

输出:

Compiler Error: redefinition of 'void fun(int)'
// PROGRAM 2 (Compiles and runs fine)
#include
using namespace std;
  
void fun(char *a)
{
  cout << "non-const fun() " << a;
}
  
void fun(const char *a)
{
  cout << "const fun() " << a;
}
  
int main()
{
  const char *ptr = "GeeksforGeeks";
  fun(ptr);
  return 0;
}

输出:

const fun() GeeksforGeeks

只有当const参数是引用或指针时,C++才允许基于参数的常数重载函数。这就是程序1编译失败,但程序2正常运行的原因。这条规则实际上是有道理的。在程序1中,参数“ i”按值传递,因此fun()中的“ i”是main()中“ i”的副本。因此fun()无法修改main()的“ i”。因此,接收“ i”作为常量参数还是普通参数都没有关系。当我们通过引用或指针传递时,我们可以修改引用或指向的值,因此我们可以有两个版本的函数,一个可以修改引用或指向的值,另一个不能。

作为练习,预测以下程序的输出。

#include
using namespace std;
  
void fun(const int &i)
{
    cout << "fun(const int &) called ";
}
void fun(int &i)
{
    cout << "fun(int &) called " ;
}
int main()
{
    const int i = 10;
    fun(i);
    return 0;
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”