2011-02-09 1046 views
6

'&'在C++中的含义是什么?作为函数在C++中'&'是什么意思?

void Read_wav::read_wav(const string &filename) 
{ 

} 

什么是内它在C相同呢?

感谢


编辑1

如果我要改变上述C++函数到C函数,我会怎么做呢?

+1

http://en.wikipedia.org/wiki/Reference_(C%2B%2B) – 2011-02-09 14:32:34

+1

as @Tim Medora said http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29(但我已更正链接;)) – 2011-02-09 14:35:02

+0

@HernánEche - 粘贴失败我的部分...谢谢! – 2011-02-09 14:36:29

回答

12

在这方面参考,&使得变量的引用。

通常,当你传递一个变量的函数,变量被复制,并在功能上工作的副本。函数返回时,原始变量不变。当您传递参考时,即使函数返回,也不会进行复制,并且该函数所做的更改也会显示出来。

C没有引用,但C++引用是功能上等同于C的指针真的是唯一的区别是,指针必须提领时,你使用它们:

*filename = "file.wav"; 

但引用可以用,好像他们是原始变量:

filename = "file.wav"; 

从表面上看,引用都应该永远是零,虽然这不是不可能要做到这一点。

等价的C函数是:

 void read_wav(const char* filename) 
    { 

    } 

这是因为C没有string。 C语言的通常做法是在需要字符串时发送指向字符数组的指针。由于在C++中,如果你输入一个字符串常量

read_wav("file.wav"); 

类型是const char*

11

这意味着该变量是一个reference。在C中没有直接的等价物。你可以把它看作是一个在使用时自动解引用的指针,也许永远不会是NULL。

代表在C柱的典型方法是由char指针,因此函数可能会是这样的:

void read_wav(struct Read_wav* instance, const char *filename) 
{ 
} 

注:这里的第一个参数来模拟你会隐含this对象引用在C++中,因为这看起来像一个成员方法。

+0

你确定吗?!? – karlphillip 2011-02-09 14:34:11

+0

请参阅我的第一个编辑。谢谢:) – 2011-02-09 14:34:38

-3

&文件名意味着这是为filename

0

&意味着变量通过引用传递。所以,在你的函数中,你将不会有本地变量副本,而是原始变量本身。函数中所有对变量的更改都会影响原始传递的变量。

0

你可能想看看Binky Pointer fun,那就是说明了什么指针和引用的视频。

1

在C语言中,你会写这种方式:

void read_wav(struct Read_wav* , const char * pSzFileName) 
{ 

} 

的std :: string是处理为const char型数组的C++的方式。

&是一个C++参考。它的行为就好像你在背后操纵的指针(它主要是一个语法糖,以为它会提示指针后面不应该是空的合同)。

0

在这种情况下,string &filename意味着函数将接收而不是接收它作为复制的基准(存储器地址)作为参数,。

此方法的优点是您的函数不会在堆栈上分配更多空间来保存文件名中包含的数据。

0

这是一个参考,因为其他人说。 在C中,你可能写功能类似

void read_wav(struct Read_wav* rw, const char* filename) 
{ 

} 
1

的符号用于在C++中两种不同的含义:获得的东西的地址(例如一个变量或函数的),并指定可变或函数参数作为对其他地方定义的实体的引用。在你的例子中,后者的含义正在使用中。 C并没有严格地讲任何类似于引用的东西,但是指针(或者指向指针的指针)对于类似事物的年龄已经是用户了。

参见例如http://www.cprogramming.com/tutorial/references.htmlWhat are the differences between a pointer variable and a reference variable in C++?http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29了解有关C++中引用的更多信息。

1

在这种特殊情况下,std :: string有一个c_str方法,它返回一个const char *。你可以做一个平行的C版,然后让你的C++做这样的事情:

void Read_wav::read_wav(const string &filename) 
{ 
    do_read_wav(internal_read_wav, filename.c_str()); 
} 

其中do_read_wav是你的C程序和internal_read_wav是一个指向C风格的结构。

void do_read_wav(struct Read_wav rw, const char * filename) 

现在,如果你是在类的存储信息,你需要做一个C结构[所有字段必须是POD等]

1

引用是别名,他们都非常相似,指针。

std::string是一个char的数组,并带有明确的length(也就是说,可以在其中嵌入空字符)。

对于Better String Library,有一个C库来模拟std::string(即提供封装接口),称为bstring。它可以让你免除处理两个不同变量(数组和长度)的麻烦。

您不能使用C中的类,但可以使用转发的结构体来模拟它们(以实施封装),并且类方法只是使用显式参数变成常规函数。

总之,这导致了以下转变:

void Read_wav::read_wav(const string &filename); 

void read_wav(struct Read_wav* this, struct bstring const* filename); 

其中(除struct噪声)非常相似,你有什么:)之前