#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函数。否则是可变功能。但为什么最后一个可变?
答案 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 *”相同。