从非const对象调用const函数

时间:2014-02-07 13:57:29

标签: c++ function const overloading

我在使用const函数和const对象时遇到了函数重载的问题。 有人可以解释为什么“const foo int& int”正在打印而不是“foo int char&”在里面 以下代码?

struct A 
{
    void foo(int i, char& c) { cout << "foo int char&" << endl;}
    void foo(int& i, int j) const { cout << "const foo int& int" << endl;}
};

int main() {
    A a;
    const A const_a;
    int i = 1;
    char c = 'a';
    a.foo(i,i);
}

谢谢,

4 个答案:

答案 0 :(得分:3)

一切都很清楚。您使用两个int类型的参数调用了一个函数。有两个功能候选人。一个具有int类型的第一个参数,另一个具有char的引用参数。因此,要调用此函数,第二个参数应隐式转换为char&amp;类型。但这是一个缩小的转换,因为int的等级高于char的等级。因此,将创建一个临时对象,但临时对象只能与const引用绑定。 第二个函数不需要对其参数进行任何转换。所以它会被调用。

答案 1 :(得分:1)

因为void foo(int& i, int j) const是更好的匹配,其他函数需要int到char转换。

答案 2 :(得分:1)

第一个函数不能使用int作为第二个参数调用。 char&无法绑定到int。这意味着只有第二次重载是另一种选择。

答案 3 :(得分:0)

  1. 将函数定义为const意味着您无法更改对象中的成员变量
  2. const const函数不能被const对象调用
  3. 字符,短整数或整数位字段,无论是否有符号,或枚举类型的对象,都可以在任何可以使用整数的表达式中使用。如果int可以表示原始类型的所有值,则该值将转换为int;否则该值将转换为unsigned int。此过程称为整体提升