C ++解释重载成员函数Iterator(int i = 0)的“one liner”构造函数:i(i){};

时间:2014-11-03 21:30:52

标签: c++ constructor ctor-initializer

我对这个承包商的实际行动有疑问。我在网上找到它并且它适用于我的目的,但我希望理解它的符号。

class Iterator { 
  int i;
public:
  Iterator(int i = 0) : i(i) {};

  friend class SinglyLinkedList<Element>;
  Node* _current;

  Iterator(SinglyLinkedList& list) {
    this->list = list;
    reset();
  }

  void reset() {
    _current = list._head;
  }

  void next(){
    if(!done()) {
      _current = _current->_next;
    }
  }

  bool done(){
    bool done = false;
    if(_current->_next == nullptr) {
      done = true;
    }
    return done;
  }
private:
  SinglyLinkedList list;
};

这是一个证明其有效的成员函数。

unsigned long print(Element e, const Iterator& index) {
cout << index.i << "\n";
return 0;

const Iterator& index = 2时。功能输出2。

如果您忽略了关于Element e的部分,基本的想法是我可以使用Iterator(SinglyLinkedList& list)Iterator(int i = 0)。您可以使用index.i

访问整数归因

任何一般的见解也值得赞赏。

2 个答案:

答案 0 :(得分:4)

构造函数

Iterator(int i = 0) : i(i) {}

允许您以三种方式构造迭代器的实例:

  • 您可以在不传递参数的情况下使用此构造函数(假设为零)
  • 您可以显式调用此构造函数,向其传递单个int参数或
  • 您可以隐式调用此构造函数,传递int而不是它。

这是第一种方式:

Iterator one;

以下是第二种方式:

Iterator two(123);

以下是第三种方式:

Iterator three = 321;

回到你的代码,当你写这个

const Iterator& index = 2;

编译器创建一个临时对象,使用构造函数的隐式调用对其进行初始化,并将此临时对象的引用设置为index。这类似于构造函数的第三种调用(即隐式的),但目标是隐藏的临时对象。允许编译器在此使用临时,因为index被声明为const;没有它就不会编译。

答案 1 :(得分:0)

dasblinkenlight's answer  解释了可以使用的不同方法,但我想谈谈这里实际发生了什么。

该行是Iterator(int i = 0) : i(i) {};让我们分解所有部分。

Iterator(int i=0)做了三件事:

  1. 宣布这是Iterator
  2. 的构造函数
  3. 宣布此构造函数采用单个int参数
  4. 为单个参数提供默认值。换句话说,构造函数调用Iterator()Iterator(0)将具有相同的结果
  5. : i(i)是初始化列表。它将成员变量i(这是第一个i)分配给参数i的值(括号中的i)。

    {};是构造函数的主体。这里没有其他任何事情发生,所以它一直空着。

    编写相同内容的更详细的方法如下:

    Iterator(){
        i = 0;
    }
    
    Iterator(int index){
        i = index;
    }
    

    在大多数情况下,那个块和你提供的行基本上会有相同的结果,虽然我不太了解错综复杂的C ++,知道上面的内容是否适用于你所拥有的一些有趣的案例(如const Iterator& index = 2