Начиная с c ++ 11, вы можете использовать ключевое слово auto , если вы не хотите явно указывать тип переменной, но не путайте его с автоматическими c переменными, что означает, что они удаляется в конце блока (вы можете прочитать это: cppreference ).
Итак, в первой строке функции вызывается StrBlobPtr :: end () конструктор, создается объект типа StrBlobPtr , после вызова этого конструктора копирования создается другой объект, но этот объект будет существовать до тех пор, пока не будет достигнут конец блока (в данном случае - конец функции). После этого первый объект удаляется, поэтому у вас остается только объект, созданный конструктором копирования. Пожалуйста, проверьте этот пост: ссылка .
Ваш второй вопрос касается возврата объекта, если я прав. Вы должны быть осторожны, когда делаете это в C ++. Предположим, вы вызвали StrBlobPtr :: end () где-то в вашем коде:
StrBlobPtr obj;
obj = StrBlobPtr::end();
Итак, вы создали объект в первой строке, после этого вы вызываете функцию, возвращается объект того же типа но этот объект существует только в этой строке, после вызова StrBlobPtr :: operator = (StrBlobPtr x) объект, возвращаемый функцией, удаляется и не существует в памяти, поэтому вы не можете сделать:
StrBlobPtr* obj;
obj = StrBlobPtr::end();
потому что после указателя второй строки obj имеет адрес удаленного объекта, и если вы попытаетесь его использовать, вы получите исключение. Поэтому вы должны быть осторожны, если хотите вернуть из функции весь объект, иногда лучше создать объект в динамической c памяти с помощью оператора new и вернуть ссылку или указатель из функции. Важно, если вы вызываете эту функцию часто, каждый раз, когда вам нужно создать объект и вызвать конструктор копирования, чтобы вернуть этот объект.