C++ 调用带或不带“的函数”;常数;C+格式签名+;

C++ 调用带或不带“的函数”;常数;C+格式签名+;,c++,constants,C++,Constants,我猜对于const对象,它会查找const函数。否则是可变函数。但为什么最后一个是可变的 但为什么最后一个是可变的 将pobj1声明为指向非const对象的const指针。对象仍然是可变的,但指针不是可变的 初始化变量后,您将无法将其更改为指向另一个变量 Object*const pobj1 = &obj1; 但是您仍然可以更改它指向的变量,并通过指针调用类的非const成员函数 pobj1 = &obj2; // Not OK. 但为什么最后一个是可变的 这是因为声明

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

但为什么最后一个是可变的

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

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

Object*const pobj1 = &obj1;
但是您仍然可以更改它指向的变量,并通过指针调用类的非
const
成员函数

pobj1 = &obj2;    // Not OK.
但为什么最后一个是可变的

这是因为声明是
Object*constpobj1
。因为我们使用的是指针,所以有两种常量的可能性

*pobj1 = obj2;    // OK
我相信你的意思是“const Object*”。“const”可以应用于指针和/或指针指向的对象。扭曲之处在于“Object*const”与“Object 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
将pobj1声明为指向非常量对象的常量指针。如果你对此表示怀疑, 把它改成

Object*const pobj1 = &obj1;
这将无法编译,因为它丢弃了obj2的常量限定符

顺便说一句,限制是对于const对象,它只能使用const函数括号后的const表示“this*”指针将被视为指向方法中const对象的指针


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

pobj1
是指向非常量
对象的常量指针。指针本身不能修改(不能指向其他对象),但它指向的对象可以修改,因此调用非常量重载。请注意,
对象常量
对象常量*
对象常量*
常量对象*
的类型不同
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
Object*const pobj1 = &obj1;
Object*const pobj2 = &obj2;