Хорошо, так что в последнее время я глубоко вникаю в C ++, и у меня все получается. Указатели наконец начинают понимать, когда мне следует их использовать, как правильно их реализовать и т. Д.
Тем не менее, был один маленький вопрос о фундаментальном использовании указателей, на который у меня все еще был ответ, на который мне нужно было ответить. Я прыгну прямо на код:
Со следующим классом A
и функцией foo(A* bar)
...
class A
{}
void foo(A* bar)
{}
... в чем разница между следующими вызовами foo
?
A* a;
A b;
foo(a);
foo(&b);
Они оба прекрасно компилируются, и, насколько я помню, у меня не было с ними проблем.
Я думаю, что A b;
создается прямо здесь, тогда как A* a;
необходимо создать с помощью new
(так как он фактически не создал объект, он просто содержит 4-байтовую длинную ссылку на потенциал A
объект).
Я мог бы, если я правильно об этом думаю, сделать a = b;
( РЕДАКТИРОВАТЬ сделать это a = &b
) и затем успешно передать a
в foo
. Но если я не сделаю a = &b
и foo
попытается прочитать (несуществующий) объект, на который указывает a
, это вызовет ошибки времени выполнения.
Кроме того, если вышеприведенное верно, то предполагается, что я могу успешно позвонить foo(&b);
просто отлично.
Я прав?
Спасибо!