2016-03-16 2 views
0

Say, если у меня есть бинарное дерево узлы определяются следующим образом: (и просто предположить, что все члены являются общедоступными для удобства ...)Неоднозначного вызов ссылочного класса члена

class node 
    { 
    public: 
     int v; 
     node* left; 
     node* right; 
    //member functions.... 
    } 

И я два узел указателей назвали и B и запустить следующий сценарий:

node* A; 
    node* B; 
    A->left = B; 
    A->left = NULL; 

делают ли точка B на NULL или изменяет только левый указатель ребенка (т.е. this-> слева в * A) и B по-прежнему остается то, что он используется, чтобы указать ?

Если первый случай верен, как я могу изменить значение A-> left, не затрагивая B?

TIA!

ответ

3

Нет, это не так. A->left = NULL только изменяет значение A->left.

Примечание: Я предполагаю, что A и B инициализирован как-то, потому что если вы запустите

node* A; //uninitialized 
node* B; //uninitialized 
A->left = B; 
A->left = NULL; 

вы получите аварии.

Обновление/уточнение: Скорее всего, я имею в виду. Но даже если это будет работать (например, из-за вашей феноменальной (недостатки) удачи, вы можете получить значение мусора, указывающее на действительную область памяти), это ничего хорошего не принесет. Если вы получите действительную область памяти и напишите там, принесет какой-то желаемый результат, немедленно прекратите отладку и перейдите в ближайшее казино, у вас будет счастливый день :)

+0

UB не требуется сбой:/, – Jarod42

+0

@ Jarod42, с вероятностью 99,84% (значение измеряется и точным :)) в этом конкретном случае, поэтому я решил не вникать в него. «Это UB» звучит так: «он, вероятно, сработает, но по какой-то причине он, вероятно, сломается». И в этом случае (мы разыскиваем значение мусора как указатель и пытаемся что-то там написать), он будет крутиться (почти) повсюду. Если OP не очень удачлив или его компилятор очень остроумный. Тем не менее, если вы хотите, я сейчас отредактирую ответ, чтобы сделать его более конкретным. – FreeNickname

+0

Спасибо. Да, я забыл набрать код инициализации A и B (извините, что я больше фокусируюсь на самом вопросе, а не на коде. Чтобы убедиться, что доступ к A-> left по существу обращается к адресу (& A + sizeof (int)), верно? (т.е. this-> left вместо B)) –

Смежные вопросы