2015-06-18 3 views
0

Я просматриваю фрагмент кода, и у меня есть эта последовательность.Передача аргументов через ссылку и указатель C++

class MyVariable { 
.... 
    CustomType z; 
.... 
} 

a.cpp

вызов функции f (& myVariable)

В включаемого файла у меня есть это:

B.h

void f (MyVariable * myVariable); 

B.cpp

f(MyVariable * myVariable){ 
    CustomType & x = myVariable ->g(); 
} 

где г представляет собой метод класса MYVARIABLE и реализация является:

CustomType & g() { 
    ... 
    return z; //where you can find z in the class 
} 

Это выглядит довольно сложным для меня, хотя, так что мой вопрос:

Любое изменение на x, которое отражается на myVariable, которое используется как параметр в вызове функции в A.cpp?

Другими словами, если в B.cpp, я сделать что-то вроде этого:

// change x with some value 

Будет ли это изменение будет отражено в MYVARIABLE, а?

ответ

1

Да. Там нет копии, поскольку вы используете указатели или ссылки, когда вы «передаете» переменную из одного места в другое, так что вы фактически используете одну и ту же переменную везде.

В g(), вы возвращаете ссылку на z, то в f() вы держите эту ссылку на z. Более того, когда вы звоните f(), вы даже не копируете myVariable, а его адрес (в виде указателя), поэтому вы действительно будете изменять член z переменной myVariable, который у вас есть в A.cpp.

1

x является неконстантной ссылкой на z члена myVariable, так что да, если вы измените x, myVariable->z будет меняться.

Вы можете думать о ссылках в качестве псевдонимов, x - это просто другое имя для myVariable->z.

1

Да, поскольку адрес переменных передается любым изменением x внутри функции, изменяется значение переменной, с помощью которой вызывается функция. Или указатели ссылаются на одно и то же место в памяти. Так что изменение значения одного изменения другие значения автоматически.

0

Всякий раз, когда переменная передается либо по ссылке, либо по адресу, любое изменение этой переменной в вызываемой функции отражается в функции вызывающего абонента. Чтобы ответить на ваш вопрос, да, любое изменение X будет отражено в myVariable, и это применимо, даже если X является частной переменной.