Допустим, у меня есть класс с частным конструктором, и этот класс будет использоваться для представления одного объекта. Допустим, у меня есть некоторые нестатические элементы, к которым я хочу получить доступ без использования оператора разрешения области. Я заметил, что могу добиться этого, создав для этого указатель на тип класса. Мне было интересно, почему я могу объявлять указатели на этот класс, даже если конструктор по умолчанию является закрытым? Вот пример программы.
// Example program
#include <iostream>
#include <string>
class OnlyOne{
public:
void Location(){
std::cout<<10<<std::endl;
}
private:
OnlyOne();
};
int main()
{
//does not work Location() is not a static member
//OnlyOne::Location();
// doesn't work because default constructor is private.
//OnlyOne one;
//one.Location();
OnlyOne* two=nullptr;
two->Location();
}
Я искал в Интернете, чтобы увидеть, смогу ли я найти ответ, и не смог получить то, что ищу.
OnlyOne* two=nullptr; two->Location();
работает как положено. Одним из практически бесконечных возможных проявлений неопределенного поведения является ожидаемое поведение. Поистине неприятная штука, UB, потому что легко доказать, что она у тебя есть, и очень трудно доказать, что у тебя ее нет. В этом случаеLocation
не используетOnlyOne
, для которого она была вызвана, никогда не используетthis
, поэтому программа может никогда не заметить, что у нее плохойthis
. - person user4581301   schedule 19.07.2020