| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2018 人关注过本帖
标题:c#和c++的引用有什么不同,大家围观一下,我写了些自己的理解
只看楼主 加入收藏
cpxuvs
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:45
专家分:142
注 册:2015-12-22
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:1 
c#和c++的引用有什么不同,大家围观一下,我写了些自己的理解
程序代码:
        static void swap(ref string s1,ref string s2)
        {
            string temp=s1;
            s1=s2;
            s2=temp;
        }


本人刚学c#,有点c++基础,发现c++引用和c#引用有点让人混淆。上面是交换两个字符串的内容的函数

其实我在思考这个问题的时候,已经想明白了一些东西,但是还是有点困惑。下面是我的理解,大家可以看看。

As stated in "Java for C++ programmer", "It is sometimes said that Java doesn't have pointers. That is not true. In fact, objects can only be referenced with pointers. More precisely, variables can hold primitive values (such as integers or floating-point numbers) or references (pointers) to objects." C# is the descendant of C++ and Java, this statement is true for C#.

这是我在网上找到的一句话,意思是说变量保存的要么是值,要么是对象的引用(指针)。这点对c#,Java,c++都成立。

如果理解了上面那句话,那么可以理解c#参数传递的规则是:默认以值传递。对于引用类型,传递的是它的句柄,而句柄本身也就是值。

我们再来看c++
程序代码:
#include <iostream>
using namespace std;
void swapint(int &a,int &b);
int main()
{
    int x=1;
    int y=2;
    swapint(x,y);
    cout<<x<<y<<endl;
    return 0;
}
void swapint(int &a,int &b)
    {
    int temp;
    temp=a;
    a=b;
    b=temp;
    }

既然c++也满足这样的规则,那么引用参数传递的过程是
&x=&a,&y=&b//分别取x,y的地址,传递给a,b
...函数执行
&x=&a,&y=&b//将变化后的地址返回给x,y,这里可能的&写的不正确,我要表达的意思是,这里会解引用。
解引用意思是:取指针指向的地址的内容

但如果c#不使用ref(不使用ref,也是传地址(句柄)),那么效果和按值传递是一样的。
&x=&a,&y=&b//传递地址
...函数执行

因为c#少做了这上面的第三步,或者说,c#理解的地址就是个值,它无法判断是否要解引用
所以需要加上ref

至此,我觉得我的想法可以分清c#和c++引用的区别。c++在前面明确指出了是个引用所以后面会自动解引用,而c#如果没有加ref,那么默认它就是个值,然后按值传递。


但是c#为什么不是自动为我们不补上第三步呢?是我理解错了还是c#不够智能,它本质上无法区分参数是个值还是引用,所以需要手工加上ref以示区分?

我觉得是后者,因为如果c#够聪明,那么c++也可以这么干,不用再定义函数时,使用指针或者引用作为参数,一切自动处理就行。(如果这么做,那么我想这应该是一种更加纯粹的面向对象的编程语言,没有基本类型,一切都是类,所以不需要区分值和引用,所有的都是引用)

但是理智考虑,觉得做到这点不难。难道c#编译器不会做个标记,区分一下引用类型和值类型吗?或者是说c#是故意这么做的,允许我们自己选择按值传递还是引用,有时候我们需要一个对象的副本?



好了,有大神愿意解释下吗?上面是我自己的一些理解,可能以上都是错的。我脑洞极大,不敢再写。

至于如果你跟我说什么c#里面的地址是句柄,而c++里面是内存地址,那抱歉,我实在无法理解这两者在逻辑上有什么区别?












搜索更多相关主题的帖子: 字符串 
2016-05-18 22:04
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:20 
C#对于基本类型默认是值传递,引用类型默认传的是引用,对于值类型,加上ref,会把值类型当成引用传递
C#中string类型确实是引用类型,但又比较特殊,许多人把它当成值类型来理解也无可厚非,所以你举的例一个用string,一个用int,其实并不很恰当,但并不影响你要表达的意思
作为一种强类型语言,我更喜欢C#的这种方式
无论什么语言,主要还是在于编译器,若修改一下编译器,C#也可以跟C++的写法相同。相同的代码,即使写法不用,若编译成汇编,结果可能都是一样的(并未验证)
我认为只是语法上的区别而已,并不是智不智能的问题
C#并不允许我们自己选择实参是值传递还是引用,形参是啥类型,实参就必须是啥类型
2016-05-18 23:20
快速回复:c#和c++的引用有什么不同,大家围观一下,我写了些自己的理解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016424 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved