【问题标题】:When should I pass "T* const&" type of pointer ?我什么时候应该传递“T* const&”类型的指针?
【发布时间】:2011-10-01 22:16:46
【问题描述】:

当我打算更改函数内的指向值时,我会传递T*& 指针:

void foo(char *&p)
{
  p = (b == true)? new char[10] : 0;
}

但我无法获得T* const& 类指针的用例(因为该指针不可更改)?我的意思是为什么我不应该简单地通过T* const

void foo(char* const &p);  // p is not changeable
void foo(char* const p);   // p is not changeable

【问题讨论】:

    标签: c++ pointers constants pass-by-reference


    【解决方案1】:

    如果指针对象的值可能会被函数外部的某些东西更改,并且您希望能够观察指针对象值的更改,或者如果您想要存储指向指针对象的引用或指针以供以后读取。

    T* 参数(相当于 T* const 作为函数参数)只是为您提供指针对象的副本,它是传递给您的函数时的值的快照。

    void foo( char* const& ptr )
    {
        char* p1 = ptr; // initial value
        global_fn();    // ptr might be changed
        char* p2 = ptr; // new value of ptr
    }
    

    void foo2( char* ptr )
    {
        char* p1 = ptr; // initial value
        global_fn();    // ptr can't be changed, it's local to this function
        char* p2 = ptr; // will be the same as p1
    }
    

    从技术上讲,即使是函数本身也可能会更改传递给它的引用的指针的值。

    例如

    char* p;
    
    std::ptrdiff_t foo( char* const& ptr )
    {
        ++p;
        return p - ptr; // returns 0, would return 1 if the parameter was by value
    }
    
    int main()
    {
        char test[] = "Hello, world!";
        p = test;
        foo( p );
    }
    

    【讨论】:

    • 但是如果它被外部的东西改变了,它必须是不稳定的,对吧?
    • @Mehrdad:不,我不知道你为什么这么认为。
    • @Mehrdad:只需通过const 引用参数以外的其他方式更改指针。严格来说,它甚至不必在函数外部,当然也不必超出程序的控制范围。
    • @Mehrdad:首先,如果它是由另一个线程完成的,volatile 不是答案。 volatile 和多线程永远不应该在你的脑海中出现! volatile 修复任何东西是完全错误的。顺便说一句,不,它不必由另一个线程完成。取消查尔斯发布的代码:char* globalP = 0; void global_fn() { globalP = new char; } int main() { foo(globalP); }。观察foo执行过程中,ptr会发生变化,因为globalP会发生变化。
    【解决方案2】:

    差异实际上为零。 const 引用用于防止复制昂贵的复制或在通用代码中不可复制的类型,但由于指针是微不足道的,它可以忽略不计,您也可以按值获取。

    【讨论】:

      【解决方案3】:

      我认为一个更简单的例子可以说明 Charles Bailey 的观点。让我们删除它的指针部分的问题,因为对于这个问题它是无关紧要的。所以你的问题基本上变成了:

      void foo(const int &p);  // p is not changeable
      void foo(const int p);   // p is not changeable
      

      您是否更清楚地了解它是如何工作的?是的,在这两种情况下都不能分配局部变量“p”。是的,任何一段代码都不会影响调用范围内的变量。但在前一个示例中,p 可能是对可以更改的变量(非 const)int 的引用,而后者是按值传递的参数,无法更改。 (实际上第二个示例中的const 对函数之外的任何内容都没有影响,因此有点多余。与问题中的第二个示例相同。)

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 2010-12-28
        • 2018-11-10
        • 1970-01-01
        • 2012-03-06
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多