Я думаю, это будет сделано. Он проверяет не 000000 и ваше исходное регулярное выражение.
(?!0{6})^[A-Z0-9][0-9]{5}$
При передаче значением:
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
".
Я думаю, что много беспорядка сгенерировано, не передав то, что предназначено [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
Мое понимание слов, "Если функция изменяет то значение, модификации, появляется также в рамках функции вызова и для передачи значением и ссылкой", то, что они ошибка .
Модификации, сделанные в вызванной функции, не в пределах функции вызова при передаче значением.
Или Вы ввели заключенные в кавычки слова с опечаткой, или они были извлечены из любого контекста, сделанного, что, кажется, является неправильным, правильным.
Мог Вы удостоверяться, что правильно заключили свой источник в кавычки и при отсутствии ошибок, там дают больше текста, окружающего тот оператор в исходном материале.
Поскольку я анализирую его, те слова являются неправильными. Это должно читать, "Если функция изменяет то значение, модификации появляются также в рамках функции вызова при передаче ссылкой, но не при передаче значением".
Большое спасибо все для всех они вводят!
я заключил то предложение в кавычки из примечания лекции онлайн: http://www.cs.cornell.edu/courses/cs213/2002fa/lectures/Lecture02/Lecture02.pdf
первая страница 6-й слайд
" Передача ЗНАЧЕНИЕМ значение переменной передается функции, Если функция изменяет то значение, модификации остаются в рамках той функции.
Передача ССЫЛКОЙ ссылка на переменную передается функции, Если функция изменяет то значение, модификации появляются также в рамках функции вызова.
"
Большое спасибо снова!
Я не уверен, понимаю ли я Ваш вопрос правильно. Это немного неясно. Однако то, что могло бы смущать Вас, следующее:
При передаче ссылкой, ссылка на тот же объект передается вызванной функции. Любые изменения в объекте будут отражены в исходном объекте, и следовательно вызывающая сторона будет видеть его.
При передаче значением, конструктора копии вызовут. Конструктор копии по умолчанию только сделает мелкую копию, следовательно, если вызванная функция изменит целое число в объекте, то это не будет замечено функцией вызова, но если функция изменит структуру данных, на которую указывает указатель в объекте, то это будет замечено вызывающей стороной из-за мелкой копии.
я, возможно, неправильно понял Ваш вопрос, но я думал, что дам ему удар так или иначе.