返回const'the'指针

时间:2010-12-26 05:24:17

标签: c++

如果this是指向类对象的const指针,如何从非const返回类型返回一个const指针?

Class T
{
 public:
   T* func(){return this;}
};

4 个答案:

答案 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; }
};