在C ++中调用带或不带“const”签名的函数

时间:2015-04-05 02:11:34

标签: c++ const

#include <iostream>
using namespace std;

class Object
{
public:
    Object() {}

    void Print() const
    {
        cout << "const" << endl;
    }

    void Print()
    {
        cout << "mutable" << endl;
    }
};

void print_obj(const Object& obj)
{
    obj.Print();
}

int main()
{
    Object       obj1;
    const Object obj2;
    Object*const pobj1 = &obj1;

    print_obj(obj1);
    print_obj(obj2);

    obj1.Print();
    obj2.Print();

    pobj1->Print();

    return 0;
}

我知道输出是

const
const
mutable
const
mutable

我猜对于const对象,它会查找const函数。否则是可变功能。但为什么最后一个可变?

4 个答案:

答案 0 :(得分:2)

  

但为什么最后一个可变?

Object*const pobj1 = &obj1;

pobj1声明为指向非const对象的const指针。该对象仍然是可变的,但指针不是。

初始化变量后,您将无法将其更改为指向另一个变量。

pobj1 = &obj2;    // Not OK.

但你仍然可以改变它指向的变量,并通过指针调用类的非const成员函数。

*pobj1 = obj2;    // OK

答案 1 :(得分:1)

  

但为什么最后一个可变?

这是因为声明是Object* const pobj1。由于我们使用指针,因此有两种const可能性。

const Object* const pobj1 OR Object const * const pobj1
^^1^^         ^^2^^                 ^^1^^   ^^2^^
// 1 applies to the types (i.e., Object)
// 2, which is what you're using applies to the pointer, therefore you're using a non-const Object

答案 2 :(得分:0)

这个

Object*const pobj1 = &obj1;

声明pobj1是一个指向非const对象的const指针。如果你怀疑, 只需将其更改为

Object*const pobj2 = &obj2;

这不会编译,因为它抛弃了一个const限定符obj2。

BTW,限制是对于const对象,它只能使用const函数。 &#39; const的&#39;括号后表示&#39;此*&#39;指针将被视为指向方法中const对象的指针。

对于非const对象,它可以同时使用const和非const方法,但它会选择先使用非const(如果两者都定义了)。

答案 3 :(得分:-1)

我相信你的意思是“const Object *”。 “const”可以应用于指针和/或指针指向的对象。扭曲是“Object * const”与“Object const *”相同。