void f(T&) void f(&T)的区别

如题所述

void f(T)传递的是T类型对象的副本;void f(T&)传递的是T类型对象本身,这个比C语言的指针传递效率更高,编译器甚至优化到根本没有引用这回事,直接到对对象操作。还T&要求传递的是左值,它的实参绝不能是临时对象。如:
void f(int);
void g(int&);
void h()
{
int x = 0;
f(x); // 复制x的副本,这个副本在函数f结束后被销毁
g(x); // 引用x本身,函数g对x的任何修改都会对x本身进行。
f(0); // 复制int(x)的副本。
g(0); // 不可以,因为非常量引用(常量引用const T&,非常量引用T&)不能够引用非对象。
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-18
void f(T&) 说明函数的参数类型是T的引用
void f(&T) 在函数定义和声明的时候这种写法不符合语法。只有在函数调用的时候才可以
例如:f(&T);此时函数的声明应该是void f(T*),参数类型是T的指针本回答被提问者采纳
第2个回答  2012-10-18
& 表示的意思有 引用、取地址、位与。
位与 是二元运算,所以这里就只可能是引用和取地址。
void f(T&) 表示 f是一个函数,有一个T引用的参数,参数名不详,函数没返回值(返回类型位void)

至于void f(&T)则不符合语法,&T是取T的地址,就是说&T是一个值,而不是一个声明(前面T&可以是算是声明),但是void f(..)的结构确是声明一个函数,所以不符合语法。追问

void swap(int &v1,int &v2) {.......} 这个是引用形参。不能忽略数据类型。
而像
record lookup(const phone&) {.......}phone是一种类型,表示对于这种类型的引用,只是省略了对象名,比如:record lookup(const phone &abc){......}这两者是等价的!其中,phone是对象abc 的类型,与int是v1,v2 的类型相似!
不知道我的理解对不对!?

追答

对。

参考资料:http://msdn.microsoft.com/en-us/library/f0a5bh3e.aspx

第3个回答  2012-10-18
形参 T&,T为类型,&为引用(&后面的T类型变量被省略了),就是说形参为T类型的引用参数。
形参 &T,T为变量,但没有类型,这显然是不合规范的,在C/C++中,必须指明形参的类型。
第4个回答  2012-10-18
前者看起来像是T的引用参数.
后者我觉得是 地址.

void f(T&) void f(&T)的区别
void f(T)传递的是T类型对象的副本;void f(T&)传递的是T类型对象本身,这个比C语言的指针传递效率更高,编译器甚至优化到根本没有引用这回事,直接到对对象操作。还T&要求传递的是左值,它的实参绝不能是临时对象。如:void f(int);void g(int&);void h(){ int x = 0;f(x); \/\/ 复...

形参中&和*的区别
void fun(T *,T &);这样的声明就可以很好的区别出*和&了 如果是*则表示这个函数的第一个参数是一个“指针”,这个指针是一个int本身类型的指针,原则上应该指向句柄类型为int的句柄。(这段话太准确了一点,注意理解指针类型和指针指向类型的区别)如果是&则表示第二个参数是一个引用。如果说A引...

1:C语言中调用函数时,到底什么时候用&T,什么时候用T?(类似于& ,*也是...
应该是*T=NULL;主函数调用该函数时,把主函数用T的地址传递给了形参T。即,实参是&T。想想看,如果我们改变T里面的值(实际上是一个地址),这是我们的初衷吗,T里面的值是用来寻找我们真正要操作的单元的。用*T便指向了我们所要的单元(我指的是函数体内的操作。)。二叉树的一系列函数中,你会发...

求解C++“不完全定义的类型是不允许的”
void update(); \/* 虽然update()没有定义,但是类中成员的声明就是类的定义;这就是Mario的定义*\/ };没有定义的类(即不完全类型,只做类型声明),可以用这个类型的引用和指针,比如:class T;void f(T*);void g(T&);等等 其实,不完全类型的声明可能只是用于头文件 ...

DOTA里英雄物品及常用术语的(英文)缩写简称
void\/FV 虚空假面(J8脸) VS 复仇之魂 W warchief\/cent 半人马酋长 wd\/doctor 巫医(51) weaver 地穴编织者(蚂蚁) wl\/ss 术士 wolf\/lycan 狼人 Z Zues\/MK 众神之王 注:BM一般指剑圣;或者兽王 DK一般指地狱领主三刀:散夜对剑+夜叉。 碎骨锤:晕锤。 散夜对剑:双刀 SY。 米达斯之手:点金手。 远行鞋:...

JAVA中的泛型用法一种: <T> 返回值用法。
3、上面是往List集合中添加了一个String类型的数据,下图往List集合中添加一条Integer类型的数据并打印,当然也可以自己创建对象进行添加。4、泛型也是可以限制要使用的参数类型的,比如上面,list集合中,只想加入数字类型的数据,当然也是可以的,只要让类中的T继承Number就行了,如图所示。5、下面在测试...

c语言中void和int类型函数的定义,急!!!
void:中文翻译为“无类型”。常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。Int:int是将一个数值向下取整为最接近的整数的函数。INT是数据库中常用函数中的取整函数,常用来判别一个...

c里面的void是什么呀?
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没...

typedef void (*T) (void *); 是什么意思?
typedef void (*T) (void *);定义了一个指向函数的指针T,其返回值 void 类型,参数也是后面的(void *)接下来我们就可以直接使用 T 来定义这种指针变量,比如:T fn1; \/\/等价于void fn1 (void *);使用:void func(void *); \/\/声明函数 T fn1; \/\/定义变量 fn1=func; ...

如何区分Java中的值传递和引用传递(急)
引用传递(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

相似回答