c++中的私有构造函数



我是c++的新手,我正试图用如下所示的LinkedListIterator实用程序类编写一个LinkedList类。(我只列出了与问题相关的代码部分)。我已经将linkedlisttiterator构造函数创建为私有的。

现在,当我在main()中有这两行时,

    LinkedListIterator iter = list->begin(); <<== No compilation error 
    LinkedListIterator iter2;  <<==== compilation error.         

我得到第二行的编译错误,这是预期的,因为默认构造函数是私有的。然而,我不明白为什么没有编译错误的第一行?为什么?代码的第一行调用了什么?私有构造函数、复制构造函数或赋值操作符?

<标题> 代码
class LinkedListIterator {
    public:
       bool operator== (LinkedListIterator i) const;
       bool operator!= (LinkedListIterator i) const;
       void operator++ (); // Go to the next element
       int& operator* (); // Access the current element
       inline Node* hasnext();
       inline Node* next();
    private:
       LinkedListIterator(Node* p); <<==== Private constructor
       LinkedListIterator();        <<==== Private constructor
       Node* p_;
       friend class LinkedList;//LinkedList can construct a LinkedListIterator
};
....
inline LinkedListIterator::LinkedListIterator(Node* p)
: p_(p)
{ }
inline LinkedListIterator::LinkedListIterator()
{ }
inline LinkedListIterator LinkedList::begin()
{
    return first_;
}
inline LinkedListIterator LinkedList::end()
{
    return NULL;
}
.......
class LinkedList {
public:
    void append(int elem); // Adds elem after the end
    void printList();
    LinkedList() {
        first_ = NULL;
    }
    LinkedListIterator begin();
    LinkedListIterator end();
    LinkedListIterator erase(int elem);
    private:
        Node* first_;
};
main()
{
    LinkedList *list = new LinkedList();
    list->append(1);
    list->append(2);
    list->append(3);
    LinkedListIterator iter = list->begin(); <<== No compilation error 
    LinkedListIterator iter2;  <<==== compilation error.         
}

LinkedListIterator iter = <some other LinkedListIterator>被称为复制初始化并调用一个"隐藏的"构造函数:复制构造函数(c++ 03) resp。移动构造函数(如果存在,并且初始化式是临时的,在c++ 11中)。您的代码中没有提供这两个构造函数,但它们是存在的:它们由编译器生成,并且是作为公共生成的。因此,它们可以从类外部访问,并且不会得到编译器错误。

Bartek在他的回答中提到了复制省略,所以为了清晰起见,我将添加我的注释:复制/移动函数必须是可访问的(在这种情况下:public)用于复制初始化,无论复制省略是否发生,即即使它没有被调用。

没有编译错误,因为构造函数是从(即。"对象创建于")的LinkedList类(特别是从它的begin()成员函数),这是一个friend。没有其他人可以实例化这个类,所以第二行代码失败了。


具体来说,看看begin():

inline LinkedListIterator LinkedList::begin()
{
    return first_;
}

(关于访问)相当于:

    return LinkedListIterator(first_);

调用private LinkedListIterator::LinkedListIterator(Node* p)

然后,可以执行复制省略,或者调用默认的复制(或移动)构造函数,该构造函数默认是公共的。

相关内容

  • 没有找到相关文章

最新更新