Я создал указатель const, который указывает на экземпляр объекта abject, динамически распределяемый. Я не мог понять, является ли объект const постоянным или нет.
Сначала я попытался вызвать неконстантную функцию-член с помощью указателя, как и ожидалось, это вызвало ошибку компиляции, потому что (это мое объяснение, я не знаю, верно ли это или нет), этот указатель создан функцией-членом назначен этому константному указателю. Это ничего не дало.
Во-вторых, я попытался разыменовать указатель и вызвать эту неконстантную функцию-член. Я думал, что указатель this, созданный функцией-членом, теперь не будет указателем const, потому что compile не может знать, что объект, возвращаемый p
(а именно *p
), возвращается указателем const или нет. Оказывается, я ошибся.
Как функция-член понимает это?
#include<iostream>
class A
{
int a=4;
public:
A()
{}
void print()
{
std::cout<<a<<std::endl;
}
};
int main()
{
const A* p = new A();
p->print(); //1 causes compile error
(*p).print(); //2 causes compile error
return 0;
}
Я думал, что строка с меткой 2 не приведет к ошибке компиляции.
Это вызывает ошибку компиляции. Сообщение об ошибке:
"a.cpp: In function ‘int main()’:
a.cpp:21:13: error: passing ‘const A’ as ‘this’ argument discards qualifiers [-fpermissive]
p->print(); //1 causes compile error
^
a.cpp:10:9: note: in call to ‘void A::print()’
void print()
^~~~~
a.cpp:22:15: error: passing ‘const A’ as ‘this’ argument discards qualifiers [-fpermissive]
(*p).print(); //2 causes compile error
^
a.cpp:10:9: note: in call to ‘void A::print()’
void print()
^~~~~