【发布时间】:2013-08-11 09:45:02
【问题描述】:
在C++(也是C)中通过引用传递变量的常用方法如下:
void _someFunction(dataType *name){ // dataType e.g int,char,float etc.
/****
definition
*/
}
int main(){
dataType v;
_somefunction(&v); //address of variable v being passed
return 0;
}
但令我惊讶的是,当通过引用传递对象时,我注意到对象本身的名称服务于目的(不需要& 符号)并且在函数的声明/定义期间没有@987654323 @ 符号在参数之前是必需的。
下面的例子应该清楚:
// this
#include <iostream>
using namespace std;
class CDummy {
public:
int isitme (CDummy& param); //why not (CDummy* param);
};
int CDummy::isitme (CDummy& param)
{
if (¶m == this) return true;
else return false;
}
int main () {
CDummy a;
CDummy* b = &a;
if ( b->isitme(a) ) //why not isitme(&a)
cout << "yes, &a is b";
return 0;
}
我很难理解为什么要对 class 进行这种特殊处理。即使是几乎像一个类的结构也不会以这种方式使用。 对象名称是否像数组一样被视为地址?
【问题讨论】:
-
您的前提是错误的:在 C++ 中通过引用传递对象的正确方法是
void someFunction(dataType& name)或void someFunction(const dataType& name)。在 C++ 中,reference 一词具有特定含义。 -
我建议您需要阅读一些 C++ 书籍。你是通过指针传递(首先是你的变体)和通过引用传递(第二个)。
-
“我很难理解为什么要对 class 进行这种特殊处理。即使是几乎像 class 的结构也不能这样使用。” -- 没有类的特殊待遇。结构被以这种方式使用。即使是简单的内置类型(int、char、double 等)也可以这样使用。您从哪里获得有关 C++ 的信息?
-
如果你想传递一个对象的地址,any 类型(任何类或结构,或 buitlin 类型),你首先需要一个接受地址的函数(或指针)。该函数将具有这样的签名:
void somefunction(int * name)——你可以像这样将它传递给函数:int v; somefunction(&v);——如果你想传递一个对象(同样,any 类型) 通过引用(在 C++ 意义上),首先你需要一个带有这样签名的函数:void somefunction(int & name)-- 然后你可以像这样传递它:int v; somefunction(v); -
另外,您似乎区分了“变量”和“对象”。我们不在 C++ 中这样做。内置类型和类类型之间存在一些差异,主要是由于历史。但在大多数情况下,该语言努力工作,并且大部分成功地确保两者都是该语言中的一等公民,并受到同等对待。