KNU*_*KNU 27 c++ syntax class object
在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;
}
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,我注意到在通过引用传递对象时,对象本身的名称起到了作用(不需要&符号),并且在声明/定义函数期间*,在参数之前不需要符号.以下示例应明确说明:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
我有问题理解为什么这个特殊的待遇是用课堂完成的.即使是几乎像一个类的结构也不会以这种方式使用.对象名称是否被视为数组的地址?
key*_*ser 58
让你感到困惑的是,声明为引用传递(使用&)的函数不是使用实际地址调用的,即&a.
简单的答案是将函数声明为pass-by-reference:
void foo(int& x);
Run Code Online (Sandbox Code Playgroud)
是我们所需要的.然后它会自动通过引用传递.
你现在调用这个函数是这样的:
int y = 5;
foo(y);
Run Code Online (Sandbox Code Playgroud)
并将y通过引用传递.
你也可以这样做(但为什么会这样?咒语是:尽可能使用引用,需要时使用指针):
#include <iostream>
using namespace std;
class CDummy {
public:
int isitme (CDummy* param);
};
int CDummy::isitme (CDummy* param)
{
if (param == this) return true;
else return false;
}
int main () {
CDummy a;
CDummy* b = &a; // assigning address of a to b
if ( b->isitme(&a) ) // Called with &a (address of a) instead of a
cout << "yes, &a is b";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
yes, &a is b
Run Code Online (Sandbox Code Playgroud)
Mat*_*son 12
引用实际上是一个指针,有足够的糖使它味道很好......;)
但它也使用不同的指针语法,这使得使用引用比指针更容易.因此,我们&在调用带指针的函数时不需要- 编译器会为您处理.而且您不需要*获取引用的内容.
要调用引用,别名是一个非常准确的描述 - 它是"同一事物的另一个名称".因此,当a作为参考传递时,我们实际上是传递a,而不是副本a- 它是通过传递地址来完成的(内部)a,但是你不必担心它是如何工作的[除非你自己编写编译器,但是在编写自己的编译器时还需要了解许多其他有趣的事情,你不必担心何时编程].
请注意,引用对于int或class类型的工作方式相同.