C++中,int&&表示啥意思?和int&有啥不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中,int&&表示啥意思?和int&有啥不同?相关的知识,希望对你有一定的参考价值。

    在C++中,函数void func(int &p,int q)中的第一个形式参数p是“int型引用”类型。引用是C++的特殊变量类型,它是已有变量的别名。主调函数调用func把实参传给p时,实际上是给实参起了个别名p,所以在函数中对p的操作就是对主调函数中的对应实参的操作,将会使实参发生永久性改变。而func中的第二个形参int q是普通的int类型,调用时只是将实参的“值”拷贝给q,所以在函数中对q的操作并不影响主调函数中的实参值。

    int &p这样写,只在作为函数的形式参数时是正确的,若是在声明语句则必须初始化,只有写成int a,&p=a;才是正确的,因为如前所述引用“是已有变量的别名”,所以不可能独立存在。

    题面代码在调用func时把x传给了第一个int引用形参p(称为引用传递),把y传给了第二个普通int形参q(称为值传递或拷贝传递),函数中语句p=q;把y的值赋给了p,由于p是x的别名,所以使主调函数中x的值变成了y的值2;而q=t;语句虽使函数中的q变量的值变为x原先的值1,但由于q只是y的拷贝,所以并不能影响到主调函数中y变量的值。所以正确选项是D。

参考技术A 你好,int&&可以理解为右值引用,其作用是将变量绑定到一个临时变量上,一般是函数返回值。
如:
int somemethod()

int a = 10;
return a;

int&& b = some_method();
这样可以减少函数返回操作并且赋值操作时new、delete、copy操作,提高效率。特别是当返回类型比较庞大的时候,作用明显。

int&&作为形参的情况,作用类似。

“new int[5]”和“malloc(5 * sizeof(int))”在 C++ 中有啥区别? [复制]

【中文标题】“new int[5]”和“malloc(5 * sizeof(int))”在 C++ 中有啥区别? [复制]【英文标题】:What's the difference in C++ between "new int[5]" and "malloc(5 * sizeof(int))"? [duplicate]“new int[5]”和“malloc(5 * sizeof(int))”在 C++ 中有什么区别? [复制] 【发布时间】:2012-10-10 12:37:03 【问题描述】:

可能重复:What is the difference between new/delete and malloc/free?

它们在功能上是否相同,是调用 delete 时需要使用 [] 运算符的唯一区别,还是我还缺少其他东西?

谢谢

【问题讨论】:

切勿将deletedelete []malloc 一起使用!使用free malloc 是 C 主义。它需要强制转换并且应该与free 匹配,而不是delete/delete[]。 (你有什么理由不使用std::vector<int>?) new 确保调用对象的构造函数! This pretty much answers this,以及您可能关于的所有其他问题。 这可能会让你大吃一惊,但new int[5];new int[5](); 也有非常相关的区别。 【参考方案1】:

正如 Mehrdad 在 this question: 中所说的那样

malloc 分配未初始化的内存。分配的内存必须用 free 释放。

new 通过调用构造函数(如果它是一个对象)来初始化分配的内存。用 new 分配的内存应该用 delete 释放(这反过来又调用析构函数)。它不需要您手动指定所需的大小并将其转换为适当的类型。因此,它更现代且不易出错。

注意:- new 是运算符,malloc 是函数

【讨论】:

在这种情况下,malloc 和 new 都未初始化值,因为 int 是本机类型。 我认为 OP 的问题更多是关于功能,因为他问“它们在功能上是否等效......” 当 new 有对象时,不仅为对象分配空间,而且调用对象的构造函数。同样,当作为对象删除时,对象的析构函数在内存释放之前被调用。如果使用 malloc 和 free,则不会分别调用析构函数和构造函数,显然,这在 C++ 中根本不会这样做,除非在某些非常罕见的情况下,类存在而没有任何特定的析构函数/构造函数。 Operator new 自动计算它所构造的对象的大小。相反,使用 malloc(),程序员必须明确指定必须分配的字节数。此外,malloc() 返回 void *,它必须显式转换为所需的类型。这既乏味又危险。运算符 new 返回一个指向所需类型的指针,因此不需要显式类型转换。 new 是一个运算符。 C++ 中的运算符是内部函数调用。【参考方案2】:

new 具有类型安全性,malloc 没有。

new 调用构造函数,malloc 没有。

delete 调用析构函数,free() 没有。

【讨论】:

【参考方案3】:

运营商新的和新的[]。

为了请求动态内存,它存在操作符 new。 new 后跟数据类型和可选的括号 [] 中所需的元素数。它返回一个指向新分配内存块开始的指针。

它的形式是:pointer = new type orpointer = new type [elements] 第一个表达式用于分配内存以包含一个单一类型的元素。第二个用于分配类型元素的块(数组)。例如:

int * 鲍比;

bobby = new int [5];

在这种情况下,操作系统为堆中的 5 个 int 类型的元素分配了空间,并且它返回了一个指向其开头的指针,该指针已分配给 bobby。因此,现在,bobby 指向一个有效的内存块,其中有 5 个 int 元素的空间。

函数 malloc。

将动态内存分配给指针是通用函数。它的原型是:void * malloc(size_t nbytes);其中 nbytes 是我们希望分配给指针的字节数。该函数返回一个 void* 类型的指针,为什么我们必须将值类型转换为目标指针的类型,例如:

char * 罗尼;

ronny = (char *) malloc (10);

这会为 ronny 分配一个指向 10 字节的可用块的指针。当我们想要分配除 char 以外的不同类型的数据块(不同于 1 个字节)时,我们必须将所需的元素数量乘以每个元素的大小。幸运的是,我们有操作符 sizeof,它返回具体数据的数据类型的大小。

int * 鲍比;

bobby = (int *) malloc (5 * sizeof(int));

这段代码为 bobby 分配了一个指向 int 类型的 5 个整数块的指针,根据编译程序的系统,这个大小可以等于 2、4 或更多字节。

【讨论】:

【参考方案4】:

new 运算符在失败的情况下调用 new_handler,并可能引发 std::bad_alloc 异常。 malloc() 不做这些事情。

【讨论】:

【参考方案5】:

有几个不同之处。

首先,必须使用delete[] 释放new int[5],并且必须使用free 释放malloc(...)。你不能混搭。

其次,如果你使用带有构造函数的类型,那么malloc 不会调用构造函数,free 不会调用析构函数。您必须手动调用它们(或只使用new/free)。

【讨论】:

以上是关于C++中,int&&表示啥意思?和int&有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

int &n与int *n有啥区别,int* &n是啥意思

float和int有啥区别?

C语言中“SIZEOF(INT)“是啥意思?有啥作用?

int short long有啥区别?

Java中的public int和int有啥区别?

C语言中short与int有啥区别