I am new to C++ and i am trying to write a LinkedList class with a LinkedListIterator utility class as below. (i have listed only the code parts that are relevant to the question). I have created the LinkedListIterator constructor as private.
Now, when I have these two lines in main(),
LinkedListIterator iter = list->begin(); <<== No compilation error
LinkedListIterator iter2; <<==== compilation error.
i get the compilation error for the 2nd line, which is expected as the default constructor is private. However, I dont understand why there is no compilation error for the first line ? Why ? what is getting called for the first line of the code ? Private constructor or Copy constructor or assignment operator ?
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>
is called copy initialization and calls a "hidden" constructor: the copy constructor (C++03) resp. move constructor (if present, and if the initializer is a temporary, in C++11). These two constructors are not provided in your code, yet they exist: They are generated by the compiler, and they are generated as public. Therefore they are accessible from outside the class and you do not get a compiler error.
Bartek mentions copy elision in his answer, so I'll add my remark for clarity: The copy/move ctor must be accessible (in this case: public) for copy initialization, regardless of wether copy elision takes place or not, i.e. even if it does not get called.