关于c ++:范围内的指针const,以及非const外部

pointer const inside a scope, and non const outside

我想知道如何在作用域内使用指针常量,在作用域外使用非常量。

我阅读了几个主题和网页,包括新手问题:C++ const到非const转换,const指针的要点是什么?我听到的消息是"如果您需要将const强制转换为非const,这很危险,而且您的代码可能设计得不好"。但是,我不确定如何克服这一点:

我现在拥有的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void compute(const CArray<FOO> &fooArray, CArray<double> &Results)
{
    Results[0] = 0.0 ;
    for(INT_PTR i=0 ; i<fooArray.GetCount()-1 ; ++i)
    {
        const FOO *foo1 = fooArray[i] ;
        DoSomething(foo1) ; //BOOL method which needs a const *FOO as parameter

        const FOO *foo2 = fooArray[i+1] ;
        DoSomething(foo2) ; //BOOL method which needs a const *FOO as parameter

        double res = 0.0 ;
        Compare(foo1, foo2, res) ; //Compare(const FOO *foo1, const FOO *foo2, double &result)
        Results[i+1] = res ;
    }
}

但是DoSomething是一个非常贪婪的函数,我希望避免在同一个对象上调用它两次。所以我想做一些类似的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void compute(const CArray<FOO> &fooArray, CArray<double> &Results)
{
    const FOO *foo1 = fooArray[0] ;
    Results[0] = 0.0 ;
    DoSomething(foo1) ; //BOOL method which needs a const *FOO as parameter
    for(INT_PTR i=1 ; i<fooArray.GetCount() ; ++i)
    {
        const FOO *foo2 = fooArray[i] ;
        DoSomething(foo2) ; //BOOL method which needs a const *FOO as parameter

        double res = 0.0 ;
        Compare(foo1, foo2, res) ; //Compare(const FOO *foo1, const FOO *foo2, double &result)
        Results[i] = res ;
        *foo1 = *foo2 ; //what i would like to do, but I can't since *foo1 and *foo2 are const
    }
}

我"可以"删除所有的常量,但正如我读到的主题中提到的,它们在这里有一个很好的原因:DoSomethingCompare不应该修改*foo1*foo2


I 'could' remove all the const

你确实可以,这就是解决你"问题"的方法。尽管使foo1成为一个指向非常量的指针是足够的。

DoSomething and Compare are not supposed to modify *foo1 and *foo2.

因此,它们应该通过值或常量引用(或者指向常量的指针,如果这是有意义的话)获取参数。在这两种情况下,都可以将非常量引用/对象(或指向非常量的指针)传递给函数。

pointer const inside a scope, and non const outside

您需要的是一个指针,它在几个函数调用中是const,在函数外部是非常量。正如我所描述的那样:使用一个const引用(或一个不需要是const的值)参数,并将非const变量传递给函数。