Вообще говоря, странно, потому что конструктор сам по себе не должен отличаться от других методов класса, кроме автоматической подстановки стартовой инициализации членов этого класса. Но автоматическая инициализация, за неимением явной - это лишь вопрос присутствия скрытого кода, все действия же применяются к уже выделенной в стеке или куче памяти, она же не при вызове метода выделяется. Поэтому не вижу, почему бы конструктору не вызываться повторно, хотя это и выглядит бессмысленным и/или опасным извращением
)
Тем не менее, если уж вызов this->base::base() возможен, то не понимаю, почему base::base не даёт эффекта. Указание области видимости, вроде, ясно даёт компилятору понять, что речь идёт о методе, а не об объявлении безымянного объекта.
на самом деле, конструктор всё-таки отличается семантически от всех остальных методов.
различие состоит в том, что методы должны вызываться для проинициализированной области памяти (т.е. для сконструированного объекта), а конструктор должен вызываться для неинициализированной области памяти.
в конструкцию base::base() действительно заложен смысл сконструировать временный объект(это ведь конструктор, он должен конструировать, а не вызываться пользователем как метод, это его семантика). и эта конструкция доступна не только внутри класса, но и снаружи. вот так...
class Point{
public:
int x; int y;
Point(int X, int Y):x(X),y(Y){}
}
int main()
{
cout << Point::Point(1,2).x << "\n"; /*смысл конструкции - выделить память с стеке
и сконструировать в ней временный объект, так изначально и задумывалось */
cout << Point(1,2).x << "\n"; //упрощённая, более привычная, но абсолютно эквивалентная форма
return 0;
}
в языке оставлена возможность вызывать конструктор, по указателю, вот так:
в частности это можно использовать как вы писали
можно и в более извратной форме это использовать, например снаружи а не в классе, по указателю this->, вот так:
int main()
{
int (a);
der d1("");
der d2("sample str");
d2.base::base("string"); // такой вот изврат, страшно, ужасно но валидно, и все сработает и не упадёт.
cin.get();
return 0;
}
такое использование конструкторов это нонсенс. золотое правило - конструктор не должен использоваться для уже сконструированного объекта. this->base::base() - это очень нехорошо.
кстати абсолютно неверно говорить, что так никто не пишет. эта возможность вызова конструктора по указателю оставлена в языке не зря. она используется на практике, например в STL, в частности в реализации всем известного std::vector.
там необходимо выделить большой фрагмент памяти под несколько объектов и сконструировать их всех. выделение памяти - один раз, а вызовов конструкторов - много. вот здесь программисту и нужна возможность вызвать конструктор вручную, подсунув ему указатель на непроинициализированную память. выглядит это всё примерно вот так:
template<class T>
class vector{
int _size;
T* _base;
public:
vector(int size);
vector(int size,const T& val);
~vector();
... // и много чего ещё
};
template<class T>
vector::vector(int size)
:_size(size)
{
_base = (T*)malloc(_size*sizeof(T));
T* elem = _base;
for(int i=0; i<_size; i++)
{
elem->T::T();
elem++;
}
}
template<class T>
vector::vector(int size,const T& val)
:_size(size)
{
_base = (T*)malloc(_size*sizeof(T));
T* elem = _base;
for(int i=0; i<_size; i++)
{
elem->T::T(val);
elem++;
}
}
template<class T>
vector::~vector()
{
T* elem = _base;
for(int i=0; i<_size; i++)
{
elem->T::~T();
elem++;
}
free(_base);
}
такой вот смысл в вызове конструктора (и кстати деструктора тоже) по указателю...