如果this
是指向类对象的const指针,如何从非const返回类型返回一个const指针?
Class T
{
public:
T* func(){return this;}
};
答案 0 :(得分:9)
首先,this
不是“常量指针”。你在哪里得到那个奇怪的想法?指针this
具有标量类型而不是左值,这意味着它不可能是“const”或“非const”。指针this
是一个右值,它是不可修改的。
其次,无论涉及的指针是否为const,问题中的代码都是有效的。例如,以下代码的用法完全相同
int *const p = 0; /* a const pointer */
int *foo() {
return p; /* OK, no error here */
}
在这种情况下返回的是原始指针值的完全独立的副本。 p
是否为常量并不重要 - 制作const值的副本不会以任何方式违反其常量。
这正是您的代码示例中所做的 - 您将返回this
值的副本。为什么你甚至会关心this
是否为const?
答案 1 :(得分:2)
除非成员函数是const限定的(例如T* func() const
而不是T* func()
),this
的类型为T*
。
this
本身不可修改(因此你无法为this
分配内容),但它只是一个指向T
类型的对象的指针,可以像其他任何一样使用就这样。
答案 2 :(得分:1)
AndreyT 提供了解释,这里是参考。
来自标准文档 9.3.2.1此指针,
在非静态(9.3)成员函数的主体中,关键字this是一个rvalue表达式,其值是地址 调用该函数的对象。类X的成员函数中的类型是X *。 如果是会员 函数声明为const,这个类型是const X *,如果成员函数声明为volatile,则类型为 这是volatile X *,如果成员函数声明为const volatile,则其类型为const volatile X *。
解释了您提出的问题以及您对 AndreyT 所做的评论。
希望这个也有帮助。
答案 3 :(得分:0)
指针不是对象,因此如果指针是返回值,则指针是否为const无关紧要。 考虑一下:
int x;
int f() {
return x;
}
const int g() {
return x;
}
f()和g()之间实际上没有区别。
但如果将所有“int”替换为某个类的其他名称,则可能会有所不同。 “const”可能会阻止您出现某些错误,例如:当你没有正确地写一个复制构造函数时。
class T
{
int *x;
public:
T() {x = new int;}
void set_x(int n) {*x = n;}
int get_x() const {return *x;}
};
T a;
T f() {
return a;
}
const T g() {
return a;
}
int main() {
f().set_x(123); // The value is modified
// even though a return value is not a l-value.
g().set_x(123); // Compile Error
}
因此,如果您想通过引用返回值来防止修改对象的数据,那么您需要的是:
class T
{
public:
const T* func() const
{ return this; }
};