2010-02-24 54 views
1

我刚学C++,以及从C来,一些函数调用我看到这本书让我困惑:C++函数取值,他们应该采取引用

char a; 
cin.get(a); 

在C,这不可能工作,如果你这样做,将无法获得输出,因为你是通过价值传递,而不是通过引用,为什么这在C++中工作?引用和取消引用使得隐式(编译器知道cin.get需要一个指针,所以它被引用)?

+1

C没有引用,只有值。 C++有实际的引用,别名到另一个实例。 – GManNickG 2010-02-24 04:19:37

+0

然后,一元&运算符的名称是什么?我认为这是参考运营商。 – 2010-02-24 04:25:52

+2

&in C表示“地址”。在C++中,&意味着“地址”(如果在变量前面使用)或“引用”(如果在参数中键入后使用)。 – LeopardSkinPillBoxHat 2010-02-24 04:39:37

回答

11

C++

这将用C工作++因为get()函数签名可能是这样的:

void get(char& a); // pass-by-reference 

&符号0123后表示编译器比当您传递值为char时,它应该将引用传递给char而不是复制它。

这实质上意味着在get()内所做的任何更改都将反映在方法之外的值a中。

如果get()函数签名是这样的:

void get(char a); // pass-by-value 

然后a将由,这意味着a副本被传递被传递到方法作为参数之前进行。对a所做的任何更改只会是本地方法,并在方法返回时丢失。

Ç

之所以这将不是在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 
4

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

+1

+1。在C中,* *会像在scanf(“%c”,&a)中一样使用cin.get(&a),这是通过指针传递的。 – 2010-02-24 04:18:30

+1

如果我没有弄错,不需要将引用实现为指针,尽管它们通常是。 – Eric 2010-02-24 04:19:13

+0

不需要,但AFAIK所有实现都是这样做的(对于函数调用,无论如何)。 – Tronic 2010-02-24 04:19:55

1

C++允许通过引用传递(注意&,这表示一个参考时):

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

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

这就是为什么一些C++程序员不喜欢用这样的引用。
它看起来像一个函数的争论 - 你不知道'a'是否被修改的语法。

首选传递const引用(当你有一个大的对象和一个副本会很昂贵),并返回引用或最好的传递指针。

+0

-1,因为通过参数返回是完全有效和良好的风格(和有经验的C++程序员,包括标准委员会)。 – Tronic 2010-02-24 04:37:25

+0

@Martin - 当一个方法需要返回多个值时,这不起作用。 – LeopardSkinPillBoxHat 2010-02-24 04:40:47

+1

返回引用可能会引起麻烦,因为调用方无法控制返回引用引用的对象的生存期。特别是,如果你返回一个堆栈对象的引用,你的调用者将会有很多悲伤:) – 2010-02-24 04:42:14