这个C++语法是什么意思?

5

这是一个语句。我认为它使用了类型转换操作符,但后缀递增运算符有什么作用呢?

(*C)(x_i,gi_tn,f)++;

C的声明和定义:

std::auto_ptr<conditional_density> C(new conditional_density());

conditional_density类的声明:

class conditional_density: public datmoConditionalDensity{
public:
  static const double l_min, l_max, delta;
  static double x_scale[X_COUNT];    // input log luminance scale
  double *g_scale;    // contrast scale
  double *f_scale;    // frequency scale      
  const double g_max;    
  double total;    
  int x_count, g_count, f_count; // Number of elements    
  double *C;          // Conditional probability function    
  conditional_density( const float pix_per_deg = 30.f ) :
    g_max( 0.7f ){
    //Irrelevant to the question               
  }    

  double& operator()( int x, int g, int f )
  {
    assert( (x + g*x_count + f*x_count*g_count >= 0) && (x + g*x_count + f*x_count*g_count < x_count*g_count*f_count) );
    return C[x + g*x_count + f*x_count*g_count];
  }

};

父类datmoConditionalDensity只有一个虚析构函数。

如果通过调试代码来回答这个问题,那就太容易了,但是这段代码在Windows下无法构建(需要一堆外部库)。


2
那行代码背后的座右铭是:可读性是软弱者的借口? - Grizzly
3
@Grizzly,真正的程序员可以在一行代码中完成所有操作...并且是在关闭屏幕、黑暗中使用笔完成的。 :) - riwalk
3个回答

11
(*C)(x_i,gi_tn,f)++;

让我们逐步分解:

(*C)

这将对指针进行取消引用。 C是一个智能指针,因此可以对其进行取消引用以获取实际指向的元素。结果是一个conditional_density对象。

(*C)(x_i,gi_tn,f)

这里调用了conditional_density类中重载的()运算符。第一次看到可能会感到奇怪,但它就像其他一切运算符一样。最终目的是调用以下代码:

  double& operator()( int x, int g, int f )
  {
    assert( (x + g*x_count + f*x_count*g_count >= 0) && (x + g*x_count + f*x_count*g_count < x_count*g_count*f_count) );
    return C[x + g*x_count + f*x_count*g_count];
  }

最后返回一个双精度浮点数的引用:

(*C)(x_i,gi_tn,f)++

由于重载的()运算符返回一个double类型的引用,因此我可以对其使用++,以递增该double。


@akappa,你是对的,我在想逗号运算符(不要问我为什么)。我的错 :) - riwalk

3
如果我理解正确,C是一个函数对象的指针(即具有定义了operator()的东西)。这意味着:
(*C)(x_i,gi_tn,f)

意思是“取消引用 C 以获取函数对象,然后使用参数 x_igi_tnf 调用该函数。请注意,该函数返回一个 double&,因此这一行”
(*C)(x_i,gi_tn,f)++;

意思是“解引用C,使用适当的参数调用函数,最后对结果进行后增量操作。”希望这可以帮助您!

0

operator()(int, int, int) 返回一个指向双精度静态数组元素的引用。

++ 运算符会增加返回的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接