【发布时间】:2019-10-21 01:00:44
【问题描述】:
我创建了一个指向动态分配的 abject 实例的 const 指针。我无法理解对象本身是否为 const。
首先我尝试使用指针调用一个非常量成员函数,不出所料,它导致了编译错误,因为(这是我的解释,不知道是不是真的)这个由成员函数创建的指针分配给该 const 指针。它没有产生任何东西。
其次,我尝试取消引用指针并调用该非常量成员函数。我认为现在由成员函数创建的this指针不会是const指针,因为编译无法知道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() ^~~~~
【问题讨论】:
-
我不明白你在困惑什么。如果一个取消引用
const A*,则剩下一个const A,不是吗? -
然后 const A* p = new A();和 const A* p = new const A();没区别吧?
-
为什么创建的对象类型转换为 const ?我的意思是我创建一个非常量整数和指向该整数的 const 整数。
-
因为您在将其分配给
const A*类型的变量时就这样做了。 C++ 允许您将非 const 对象隐式转换为 const 类型,因为这样做是完全安全的。 -
@Sneftel 谢谢,现在我明白了:)
标签: c++ class pointers constants