C ++语法:常量引用参数

时间:2013-03-14 17:33:50

标签: c++ parameters

请在下面的代码中解释 const void * a,const void * b 。这些是常量参考参数 - 意味着此函数的内部代码无法更改其值吗?为什么要将这些参数作为参考?认为参考参数是用于传递值并允许在函数定义内更改值。为什么使用void作为参数参数?

int peak_compare(const void *a, const void *b)  //Function peak_compare
{
  Peaks *aa = (Peaks *)a;
  Peaks *bb = (Peaks *)b;

  if(aa->wt1 > bb->wt1) return -1;
  if(aa->wt1 == bb->wt1) return 0;
  return 1;
}

感谢您的任何建议。

5 个答案:

答案 0 :(得分:2)

const typename * p指向常量的指针的语法。这意味着,您无法更改函数中的值。

typename * const p常量指针的语法。这意味着您无法在函数中更改指针本身。

在上面的示例中,typename可以是从标准类型到用户定义类型的任何内容,也可以是void。如果它是void,则意图是该函数可能获得指向不同类型的指针。您应该正确地将void指针强制转换为正确的类型以访问其成员,如下所示:

Peaks *aa = (Peaks *)a;
Peaks *bb = (Peaks *)b;

但是这个演员失去了常量。正确的语法应该是:

const Peaks *aa = (const Peaks *)a;
const Peaks *bb = (const Peaks *)b;

不要失去价值常数。


修改: 正如其中一条评论所指出的那样,并且由于问题仅用C++标记,因此使用C ++样式更好地完成转换,如下所示:

const Peaks* aa = static_cast<const Peaks*>(a);
const Peaks* bb = static_cast<const Peaks*>(b);

答案 1 :(得分:0)

const void *a表示a是指向常量的void指针,因此内容无法更改 请参阅此链接以获取解释: http://en.wikipedia.org/wiki/Const-correctness

但是当你放弃const内容时,有一个危险的演员。

Peaks *aa = (Peaks *)a;

应改为

const Peaks *aa = (const Peaks *)a;

答案 2 :(得分:0)

比较两个void指针,返回一个大于,等于或小于0的整数,根据a的键是否大于,等于或小于b的键,通过将它们与peak_compare进行比较来确定()。

答案 3 :(得分:0)

使用void*类型的参数时,没有类型安全,无论它是const还是Peaks* aa = (Peaks*) a; 。你应该尽可能避免使用C风格的演员表。

aa

可能会导致operator<无效,从而导致未定义的行为


如果您因qsort而需要此功能,我建议您改用std::sort。 在这种情况下,您可以覆盖Peaks的{​​{1}}:

struct Peaks
{
    bool operator < (const Peaks& p) const
    {
        return (wt1 < p.wt1);
    }
};

可能会像这样使用:

std::vector<Peaks> vec;
...
std::sort(vec.begin(), vec.end());

另请查看Sorting a vector of custom objects:)

答案 4 :(得分:-1)

它们是指向常量数据的指针,正确,请参阅here,这样就无法通过指针更改它们指向的东西的值。