什么是值和引用语义及其区别

Posted

技术标签:

【中文标题】什么是值和引用语义及其区别【英文标题】:what is value- and reference semantics and the difference 【发布时间】:2015-01-20 22:27:24 【问题描述】:

什么是值语义和引用语义,它们之间有什么区别?你能用c中的例子给我看看吗?

我猜在引用语义中你只是发送一个指向另一个函数的指针然后它是引用语义?我发现很难掌握什么是价值语义?如果我只使用一个 int 作为参数,然后说从该函数返回一个 int 那么该函数使用值语义吗?副作用如何影响这一点?如果我是对的,那么我肯定还有其他价值语义的例子。你能给我举个例子吗? 如果一个函数将指针作为参数并且函数返回值是一个 int,那么该函数是否同时使用了引用和值语义?

【问题讨论】:

see here 或许 值语义意味着您访问副本,而引用语义意味着您访问实际事物。最接近引用语义的方法是将数组传递给函数或传递指针。 【参考方案1】:

在引用语义中,参数是指原始对象,无论是读取还是写入。

在值语义中,参数只是对象的值,即副本而不是原始值。当然,如果您更改此副本并产生一些副作用,则原始元素将保持不变。

传值示例:

int f(int a)   /* argument a is passed by value (local variable containing a copy)  */ 

    a++;      /* increments the local variable */
    return (a+5);   /* return a value */  


int main (int ac, char**av) 
    int b=7, c; 
    c = f(b);  /* b will be copied. The original value is unchanged */
    printf ("b=%d c=%d\n", b, c);  /* prints 7 and 13 */

引用传递示例:

int fr(int* pa)   /* argument pa is a pointer refering to original value  */ 

    *pa+=1;      /* increments value pointed to (the original variable) */
    return (*pa+5);   /* return by value */  


int main (int ac, char**av) 
    int b=7, c; 
    c = fr(&b);  /* The original value in b is changed */
    printf ("b=%d c=%d\n", b, c);  /* prints 8 and 13 */

通过引用返回不太明显。例如,Tt 用于返回作为参数接收的引用或与之相关的引用。或对动态分配对象的引用。

【讨论】:

你能解释一下它在 c 中的用法吗? C 没有对象。 C11 标准将对象定义为“执行环境中的数据存储区域,其内容可以表示值”(第 3.15 节)。如果您愿意,可以将其视为一个变量。

以上是关于什么是值和引用语义及其区别的主要内容,如果未能解决你的问题,请参考以下文章

第三章 面向对象编程 3.1类型系统

[c++11]右值引用移动语义和完美转发

移动语义的一切

请问函数的返回值类型那里,写“类名”和“类名&”有啥区别?

go 函数

请问函数的返回值类型那里,写“类名”和“类名&”有啥区别?