Передача по ссылке / значению в C ++

Я думаю, это будет сделано. Он проверяет не 000000 и ваше исходное регулярное выражение.

(?!0{6})^[A-Z0-9][0-9]{5}$
35
задан Dante May Code 13 May 2011 в 15:04
поделиться

6 ответов

При передаче значением:

void func(Object o);

и затем вызов

func(a);

Вы создадите Object на стеке, и в рамках реализации func на него сошлются o. Это могло бы все еще быть мелкой копией (внутренности a, и o мог бы указать на те же данные), таким образом a мог бы быть изменен. Однако, если o будет глубокая копия a, то a не изменится.

При передаче ссылкой:

void func2(Object& o);

и затем вызов

func2(a);

Вы будете только уступать новому дорогу для ссылки a". a" и" o" два названия того же объекта. Изменение o внутренний func2 будет делать те изменения видимыми в вызывающую сторону, которая знает объект именем" a".

8
ответ дан phonetagger 14 May 2011 в 02:04
поделиться

Я думаю, что много беспорядка сгенерировано, не передав то, что предназначено [1 111] переданный ссылкой . Когда некоторые люди говорят передача ссылкой , они обычно имеют в виду не сам аргумент, а скорее объект, ссылаемый . Некоторый другой говорит, что передача ссылочными средствами, что объект не может быть изменен в вызываемом. Пример:

struct Object {
    int i;
};

void sample(Object* o) { // 1
    o->i++;
}

void sample(Object const& o) { // 2
    // nothing useful here :)
}

void sample(Object & o) { // 3
    o.i++;
}

void sample1(Object o) { // 4
    o.i++;
}

int main() {
    Object obj = { 10 };
    Object const obj_c = { 10 };

    sample(&obj); // calls 1
    sample(obj) // calls 3
    sample(obj_c); // calls 2
    sample1(obj); // calls 4
}

Некоторые люди утверждали бы, что 1 и 3 передача ссылкой, в то время как 2 была бы передача значением. Другая группа людей говорит, что все кроме последнего - передача ссылкой, потому что сам объект не копируется.

я хотел бы нарисовать определение того здесь, чем я утверждаю, что был передача ссылкой . Общий обзор по нему может быть найден здесь: Различие между передачей ссылкой и передачей значением . Первой и последней является передача значением, и средние два являются передачей ссылкой:

    sample(&obj);
       // yields a `Object*`. Passes a *pointer* to the object by value. 
       // The caller can change the pointer (the parameter), but that 
       // won't change the temporary pointer created on the call side (the argument). 

    sample(obj)
       // passes the object by *reference*. It denotes the object itself. The callee
       // has got a reference parameter.

    sample(obj_c);
       // also passes *by reference*. the reference parameter references the
       // same object like the argument expression. 

    sample1(obj);
       // pass by value. The parameter object denotes a different object than the 
       // one passed in.

я голосую за следующее определение:

аргумент (1.3.1) передается ссылкой, если и только если соответствующий параметр функции, которой это называют, имеет ссылочный тип и , параметр ссылки связывает непосредственно с выражением (8.5.3/4) аргумента. Во всех других случаях мы имеем отношение к передаче значением.

, Который означает, что следующее является передачей значением:

void f1(Object const& o);
f1(Object()); // 1

void f2(int const& i);
f2(42); // 2

void f3(Object o);
f3(Object());     // 3
Object o1; f3(o1); // 4

void f4(Object *o);
Object o1; f4(&o1); // 5

1 передача значением, потому что это непосредственно не связывается. Реализация может скопировать временный файл и затем связать тот временный файл со ссылкой. 2 передача значением, потому что реализация инициализирует временный файл литерала и затем связывает со ссылкой. 3 передача значением, потому что параметр не имеет ссылочного типа. 4 передача значением по той же причине. 5 передача значением, потому что параметр не получил ссылочный тип. Следующие случаи являются передачей ссылкой (по правилам 8.5.3/4 и других):

void f1(Object *& op);
Object a; Object *op1 = &a; f1(op1); // 1

void f2(Object const& op);
Object b; f2(b); // 2

struct A { };
struct B { operator A&() { static A a; return a; } };
void f3(A &);
B b; f3(b); // passes the static a by reference
61
ответ дан Alex Johnson 14 May 2011 в 02:04
поделиться
  • 1
    Работает отлично! Я помню эту проблему с Silverlight также. Ваш данный стиль doesn' t работают, хотя - жалуется на циклическую ссылку. Это хорошо работает: < TargetType =" Стиля; Control"/> – dex3703 8 March 2011 в 09:27

Мое понимание слов, "Если функция изменяет то значение, модификации, появляется также в рамках функции вызова и для передачи значением и ссылкой", то, что они ошибка .

Модификации, сделанные в вызванной функции, не в пределах функции вызова при передаче значением.

Или Вы ввели заключенные в кавычки слова с опечаткой, или они были извлечены из любого контекста, сделанного, что, кажется, является неправильным, правильным.

Мог Вы удостоверяться, что правильно заключили свой источник в кавычки и при отсутствии ошибок, там дают больше текста, окружающего тот оператор в исходном материале.

1
ответ дан jwpfox 14 May 2011 в 02:04
поделиться

Поскольку я анализирую его, те слова являются неправильными. Это должно читать, "Если функция изменяет то значение, модификации появляются также в рамках функции вызова при передаче ссылкой, но не при передаче значением".

2
ответ дан dreeves 14 May 2011 в 02:04
поделиться

Большое спасибо все для всех они вводят!

я заключил то предложение в кавычки из примечания лекции онлайн: http://www.cs.cornell.edu/courses/cs213/2002fa/lectures/Lecture02/Lecture02.pdf

первая страница 6-й слайд

" Передача ЗНАЧЕНИЕМ значение переменной передается функции, Если функция изменяет то значение, модификации остаются в рамках той функции.

Передача ССЫЛКОЙ ссылка на переменную передается функции, Если функция изменяет то значение, модификации появляются также в рамках функции вызова.

"

Большое спасибо снова!

6
ответ дан user36064 14 May 2011 в 02:04
поделиться

Я не уверен, понимаю ли я Ваш вопрос правильно. Это немного неясно. Однако то, что могло бы смущать Вас, следующее:

  1. При передаче ссылкой, ссылка на тот же объект передается вызванной функции. Любые изменения в объекте будут отражены в исходном объекте, и следовательно вызывающая сторона будет видеть его.

  2. При передаче значением, конструктора копии вызовут. Конструктор копии по умолчанию только сделает мелкую копию, следовательно, если вызванная функция изменит целое число в объекте, то это не будет замечено функцией вызова, но если функция изменит структуру данных, на которую указывает указатель в объекте, то это будет замечено вызывающей стороной из-за мелкой копии.

я, возможно, неправильно понял Ваш вопрос, но я думал, что дам ему удар так или иначе.

5
ответ дан vboctor 14 May 2011 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: