Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++函数取值,在那里应该引用 我只是学习C++,来自C,我在书中看到的一些函数调用混淆了我: char a; cin.get(a); 在C中,这不可能工作,如果你这样做,就没有办法得到输出,因为你是通过值,而不是通过引用,为什么这工作在C++中?引用和取消引用是隐式的吗?编译器知道cin.get需要一个指针,所以它被引用了?_C++_Pointers_Reference_Pass By Reference_Pass By Value - Fatal编程技术网

C++函数取值,在那里应该引用 我只是学习C++,来自C,我在书中看到的一些函数调用混淆了我: char a; cin.get(a); 在C中,这不可能工作,如果你这样做,就没有办法得到输出,因为你是通过值,而不是通过引用,为什么这工作在C++中?引用和取消引用是隐式的吗?编译器知道cin.get需要一个指针,所以它被引用了?

C++函数取值,在那里应该引用 我只是学习C++,来自C,我在书中看到的一些函数调用混淆了我: char a; cin.get(a); 在C中,这不可能工作,如果你这样做,就没有办法得到输出,因为你是通过值,而不是通过引用,为什么这工作在C++中?引用和取消引用是隐式的吗?编译器知道cin.get需要一个指针,所以它被引用了?,c++,pointers,reference,pass-by-reference,pass-by-value,C++,Pointers,Reference,Pass By Reference,Pass By Value,引用类型的工作方式类似于按引用传递,而不是按值传递。它类似于在C中通过指针传递指针,但具有更好的语法和更安全的编译时检查。实现在内部通过指针传递。引用类型的工作方式类似于通过引用传递,而不是通过值传递。它类似于在C中通过指针传递指针,但具有更好的语法和更安全的编译时检查。实现在内部按指针传递。C++允许按引用传递注释&,表示使用引用: void foo(char& bar) { bar = 42; } int main() { char a; foo(a);

引用类型的工作方式类似于按引用传递,而不是按值传递。它类似于在C中通过指针传递指针,但具有更好的语法和更安全的编译时检查。实现在内部通过指针传递。

引用类型的工作方式类似于通过引用传递,而不是通过值传递。它类似于在C中通过指针传递指针,但具有更好的语法和更安全的编译时检查。实现在内部按指针传递。

C++允许按引用传递注释&,表示使用引用:

void foo(char& bar) {
    bar = 42;
}

int main() {
    char a;
    foo(a);
    // a == 42 here
}

C++允许按引用传递注释&,表示使用了引用:

void foo(char& bar) {
    bar = 42;
}

int main() {
    char a;
    foo(a);
    // a == 42 here
}
C++

这将在C++中工作,因为GET的函数签名可能是:

void get(char& a); // pass-by-reference
char后面的&symbol表示编译器,而不是当您传入char值时,它应该传入对char的引用,而不是复制它

这本质上意味着get内所做的任何更改都将反映在方法外的值中

如果get的函数签名为:

void get(char a); // pass-by-value
然后,将通过值传递a,这意味着在将a作为参数传递到方法中之前,将创建a的副本。然后,对方法的任何更改将只在方法的本地进行,并在方法返回时丢失

C

这在C中不起作用的原因是C只有传递值。模拟C中按引用传递行为的唯一方法是按值传递指针,然后取消引用指针值,从而在修改方法中的值时访问相同的内存位置:

void get(char* a)
{
    *a = 'g';
}

int main(int argc, char* argv[])
{
    char a = 'f';
    get(&a);
    printf("%c\n", a);

    return 0;
}
运行此程序将输出:

g
C++

这将在C++中工作,因为GET的函数签名可能是:

void get(char& a); // pass-by-reference
char后面的&symbol表示编译器,而不是当您传入char值时,它应该传入对char的引用,而不是复制它

这本质上意味着get内所做的任何更改都将反映在方法外的值中

如果get的函数签名为:

void get(char a); // pass-by-value
然后,将通过值传递a,这意味着在将a作为参数传递到方法中之前,将创建a的副本。然后,对方法的任何更改将只在方法的本地进行,并在方法返回时丢失

C

这在C中不起作用的原因是C只有传递值。模拟C中按引用传递行为的唯一方法是按值传递指针,然后取消引用指针值,从而在修改方法中的值时访问相同的内存位置:

void get(char* a)
{
    *a = 'g';
}

int main(int argc, char* argv[])
{
    char a = 'f';
    get(&a);
    printf("%c\n", a);

    return 0;
}
运行此程序将输出:

g

这就是为什么一些C++程序员不喜欢使用这样的引用。 它看起来像一个函数参数——从语法上看,您不知道“a”是否被修改


< P>在有大对象时,更喜欢传递const引用,而拷贝则是昂贵的,并且返回引用或最好的所有传递指针。

这就是为什么一些C++程序员不喜欢使用这样的引用。 它看起来像一个函数参数——从语法上看,您不知道“a”是否被修改


当您有一个大对象和一个副本时,您更喜欢传递常量引用,因为这样会很昂贵,而且返回引用或最好的传递指针。

+1。在C中,它将与scanf%C中的cin.get&a一起工作,&a是通过指针传递的。如果我没有弄错的话,不要求将引用实现为指针,尽管它们通常是这样。这不是必需的,但AFAIK所有的实现对函数调用都是这样做的。+1。在C中,它将与scanf%C中的cin.get&a一起工作,这是通过指针传递的。如果我没有弄错的话,它不要求将引用实现为指针,尽管它们通常是这样。这不是必需的,但AFAIK所有实现对函数调用都是这样做的。无论如何,C没有引用,只有值。C++有实际引用,别名为另一个实例。那么,一元和操作符的名称是什么?我以为是引用运算符。&在C中表示地址。在C++中,“是”,如果变量在变量前面使用,或者在参数中使用类型之后引用,则C没有引用,只有值。C++有实际引用,别名为另一个实例。那么,一元和操作符的名称是什么?我以为是引用运算符。&在C中表示地址。在C++中,“是指在变量前面使用的地址”或“引用”。
如果在参数中使用类型。- 1,因为参数返回是完全有效的,而且风格好,而且有经验的C++程序员,包括标准委员会,都会这么做。@马丁——当一个方法需要返回多个值时,这种方法不太好。返回引用可能会招来麻烦,因为调用方无法控制返回引用引用的对象的生存期。特别是,如果你返回一个对堆栈对象的引用,你的调用方将陷入很多悲痛:我以前见过这样的说法:“有经验的C++程序员不喜欢使用引用”…还想知道那些“有经验的C++程序员”是谁。我觉得这种说法有点主观,除非你能提供这方面的文献。我没有看到任何一本书,我都读过著名的C++大师。1,因为参数返回是完全有效的,而且风格很好,而且有经验的C++程序员,包括标准委员会,这样做。@Martin-当一个方法需要返回多个值时,这种方法不太管用。返回引用可能会带来麻烦,因为调用方无法控制返回引用所引用的对象的生存期。特别是,如果你返回一个对堆栈对象的引用,你的调用方将陷入很多悲痛:我以前见过这样的说法:“有经验的C++程序员不喜欢使用引用”…还想知道那些“有经验的C++程序员”是谁。我觉得这种说法有点主观,除非你能提供这方面的文献。我没有看到任何一本书,我读过的书都是著名的C++大师。