【问题标题】:C++ double *() () { } overloading?C++ double *() () { } 重载?
【发布时间】:2015-12-09 12:50:24
【问题描述】:

我见过这样的课程:

class Vec2D {
    int i_;
    int j_;
    vector<double> vec;

public:
    Vec2D(int i, int j): i_(i),j_(j) {vec.assign(i_*j_,0);} 
    double & operator() (int i, int j){return ver[j_*i+j];} // overloading
    double * operator()(){return &(vec[0]); }               // ???
};

我了解double &amp; operator() 用于运算符重载。

至于double * operator()(){return &amp;(vec[0]); },明明是用来返回一个指向第一个元素的指针,但是机制我不懂,是重载还是函数指针?

【问题讨论】:

  • Function call operator的可能重复
  • @KarolyHorvath 在我看来,链接问题更关注“双运算符()()”而不是双 *运算符()()
  • @KarolyHorvath 但令人困惑的是,链接的答案表明它被用作仿函数,它既是运算符重载又是仿函数?
  • 是运算符重载,允许将对象用作仿函数。

标签: c++ pointers operator-overloading


【解决方案1】:

operator()function call operator

double * operator()(){return &(vec[0]); }  

Vec2D 定义一个函数调用运算符,它返回一个double * 并且不接受任何输入。你会在你的代码中使用它作为

Vec2D foo;
double * bar = foo();

然后你重载函数调用操作符

double & operator() (int i, int j){return ver[j_*i+j];} 

这为Vec2D 定义了一个函数调用运算符,它返回一个double &amp; 并接受2 个ints。它会像

一样使用
Vec2D foo;
double & bar = foo(0, 0);

【讨论】:

  • 在我看来两者都是关于运算符重载的,唯一的区别是 1-“double *()(){}”返回一个指针。 2-第二个括号不带参数。 ?
  • @lorniper 是的,这些是重载函数。一个接受两个参数,另一个没有。函数重载不关心返回类型。函数参数必须不同才能重载函数。
  • 谢谢!所以在这种情况下用“double * operator() (int i, int j)”替换“double * operator()()”是非法的?
猜你喜欢
  • 1970-01-01
  • 2013-07-23
  • 2021-08-04
  • 2013-02-18
  • 2018-09-23
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多