c++中&和&&引用工作原理的区别?

我知道引用&和&&分别适用于何中情况,现在恳请指导如下问题:

引用&是一个类型变量的别名,如:( int &a=b;) 表示的a和b是同一个变量(既a的地址和b的地址相同),那么引用&&表示的是什么?如:(int &&k=i+j;)k 和 i+j 间的联系,请具体说明。

&&就是右值引用, &是普通的左值引用, 左值是可以放在赋值号=左边的值, 右值是只能放在=右边的值, 右值没有一个"变量"名字, i+j返回的值可以视作是放在一个临时存放内存空间里的, 这个空间并不能被用来赋值, 你不能写i+j = 5等; &&可以把这种临时的值和存在变量里的值区分开来


常见应用情况是, 例如String类内部都有一个char *指针pstr指向实际存放字符串的内存, 当写str3 = str1.concat(str2)的时候实际执行了2次构造函数, 第一次是concat构造一个新的String对象, 第二次是赋值的时候执行了一次拷贝构造函数(或者operator=)把concat返回的临时值复制了一次给str3的内存, 然后concat的临时值在之后立即被销毁了, 显然这个第二次拷贝构造很多余

有了&&之后可以给String增加一个参数是&&的拷贝构筑函数以及operator=(&&)来解决这个问题:

String(String &&other) {
    pstr = other.pstr;
    other.pstr = nullptr; //直接把临时值other的pstr拿来用而不再复制一次, 然后把other.pstr置null避免other的析构函数delete pstr
}

追问

本人是新学员,对string内部成员不尽了解,以下是我对你解释的理解,不知正确与否

追答

把右值赋给const &指向的就是临时空间, 因为标注了const肯定不能作写入或修改只能读取所以没什么关系, 去掉const编译器就该报错了, 另外有的编译器把右值赋给const &也会报错

追问

是不是可以像以下这样理解
int &k中的 k 的地址 不能是 右值的地址(既临时空间地址),k只能是 已有变量的 别名
int &&k中的 k 的地址 只能是 右值的地址,既 int&&k,不能当作已有变量的别名
而允许const &的系统中 const int &k=i+j;与const int &&k=i+j;等价

追答

温馨提示:内容为网友见解,仅供参考
无其他回答

c++中&和&&引用工作原理的区别?
&&就是右值引用, &是普通的左值引用, 左值是可以放在赋值号=左边的值, 右值是只能放在=右边的值, 右值没有一个"变量"名字, i+j返回的值可以视作是放在一个临时存放内存空间里的, 这个空间并不能被用来赋值, 你不能写i+j = 5等; &&可以把这种临时的值和存在变量里的值区分开来 常见应用情况...

c++中&和&&有什么区别
区别一:意思不同 1、&表示按位与操作。2、&&表示逻辑与的意思,即为and。区别二:程序执行的时候不同 1、当运算符&&两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。比如 12&&23的结果就是1,12&&-1 的结果是1,123&&0的结果就是0 2、我们通常...

c++中&和&有什么区别
他们不同点在于&&相当一个开关语句,就是说如果&&前面值为false那么他就不继续执行后面的表达式;而&不管前面的值为什么,总是执行其后面的语句。&可以是取地址运算符也可以是引用符,这就看你在什么情旷下用了;而&&是逻辑与的意思如if((a = 78)&&(b = 77))它不过是个比较运算符...

C语言&和&&的区别,|和||的区别?
区别:1.运算符性质不同。&是一个位运算符。&&是一个逻辑运算符。2.作用不同。&是将两个二进制的数逐位相与,结果是相遇之后的结果。&&就是判断两个表达式的真假性,只有两个表达式同时为真才为真,有一个为假则为假,具有短路性质。3.用途限制。&除了是一个位运算符,也是取地址符。&&就...

&和&&的区别
则会停止后续命令的运行。在C++中,&&也有其特定用途,如用于指定rvalue引用类型,而在C语言中,&&除了作为逻辑与运算符,当左边表达式或变量为0时,会停止计算右侧,整个表达式的结果为0,这体现出与运算的特性。总的来说,&和&&的选择取决于编程需求,理解它们在不同语境下的行为至关重要。

c++中 &和&&的区别是什么?
1 && 1 = 1, 0 && 0 = 0,1就是true,而0就是false &是与的意思,a & b就是a和b的每一位都执行我在上一行写的运算 比如a = 11111111 (十进制中的255),b = 00000100(十进制中的4)a & b = 00000100 同理1010 & 1100 = 1000 | 和 ||也有类似关系 1010 | 1100 = 1110 ...

C++中&和&&、float和double的分别
这是因为浮点型数数据的精度问题导致我们看到的和实际的数是不同的 对你补充的代码的&&和&的区别的回答:int main(){ char a=-128;unsigned char b=127;if(a&b)\/\/这里是位运算 cout<<"YES";if(a&&b)\/\/这里是逻辑运算 cout<<"NO";system("PAUSE");return 1;} 下面做分析:char a=-...

&和&&的区别
1:&&在Java和PHP以及c#中都是逻辑操作符,也叫条件操作符。2:&&在bat中顺序执行多条命令,执行过程中如命令出错则停止执行之后的命令。3:c++中也会用&&来指定一个rvalue的引用类型。4:c语言中&&是一种双目运算符,表示与运算,而当左边所给表达式或变量为0时,不再计算右侧,整个表达式为零。

&&和&的区别是什么?
&和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件语句执行完为止。如&&例子中的i++>5被执行了,而i++<9并没有被执行,这就是他们的差别。&例子中的i++>5和i++<9都被执行了。

C语言里的&和&&有什么不同?
&&才是逻辑与,常用于表达式之间,比如x=x-1&&y=y+0就是真和假相与,结果为假(即0)而&是按位与,用于两个二进制数之间逐位求与,比如二进制数0110&1100的结果就是0100 。另外&可以作地址符(更常见的应用),格式:&变量名。比如int &a的意思就是地址a中存有整型变量 ...

相似回答