C中的私有构造函数

我是C的新手,我正在尝试使用LinkedListIterator实用程序类编写LinkedList类,如下所示. (我只列出了与问题相关的代码部分).我已将LinkedListIterator构造函数创建为私有.

现在,当我在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 =<其他一些LinkedListIterator>被称为复制初始化并调用“隐藏”构造函数:复制构造函数(C 03)和.移动构造函数(如果存在,如果初始化程序是临时的,则在C 11中).这两个构造函数未在您的代码中提供,但它们存在:它们由编译器生成,并且它们是作为公共生成的.因此,可以从类外部访问它们,并且不会出现编译器错误.

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...