C++与Java,C#的异同(一):值,地址,引用
Java,C#已经比较熟悉,最近在从0开始自学C++。学习过程中必然会与Java,C#进行对比,有吐槽,也有点赞。
先来讲讲最基本也是最重要的部分:参数传递的方式。
对于类型, Java分基本类型、复合类型,从另外一个角度分是值类型,引用类型。在展开对比前, 我们先来看看三个关键方式:
值
- 创建新的副本,与原来的没有关系
地址(指针)
- 把对象所在内存的地址传递过去
引用
- 可以理解为变量的别名
举个例子:
void testMethodA(int input) {
input = ;
}
void testMethodB(int* input) {
//int newValue = 888;
*input = ;
}
void testMethodC(int& input) {
input = ;
}
int main() {
int input = ;
cout << "Original: " << input << endl;
testMethodA(input);
cout << "After testMethodA: " << input << endl;
cout << input;
testMethodB(&input);
cout << "After testMethodB: " << input << endl;
cout << input;
testMethodC(input);
cout << "After testMethodC: " << input << endl;
std::cin.get();
// What is the value of input?
}
运行后的结果:
Original:
After testMethodA:
111After testMethodB:
888After testMethodC:
解释一下:
函数 testMethodA 的参数是值传递的,调用函数后,创建了一个input的副本,副本的值改变了, 但是input值没有被改变。
函数 testMethodB 的参数是地址(指针)传递的,函数内修改了input指向的那块内存区域,所以input的值也被改变了。
函数 testMethodC的行为看起来是和函数 testMethodB是一样的, input值也被改变了,他们有什么区别呢?
区别在于:
传递地址,函数内改变的是变量指向的那块内存区域的内容。
传递引用,函数内改变的是变量的指向,换句话说,input指向的内存地址都变了。
如下图:

在C++里面,所有的类型,不管是基础数据类型,结构体,还是类,默认都是“值”传递的;显式声明为指针,才是传地址;显式声明为引用,可以认为就是给变量起了一个别名。
在Java里面,只有基础数据类型(int, double, float等),是值传递的,所有的类对象,都是传地址(注意,不是传引用), 实际上,java里面没有引用传递的概念。
在C#里面, 基础数据类型,结构体, 默认都是值传递;所有的对象, 默认都是传地址;如果想传引用,在参数前面加ref关键字,例如:
void testMethodC(ref int input) {
input = ;
}
C++与Java,C#的异同(一):值,地址,引用的更多相关文章
- atitit。全局变量的设计与实现 java php的异同
atitit.全局变量的设计与实现 java php的异同 1. 超级全局(Superglobals)"变量 1 2. 全局变量和"global"关键字 1 3. 更加好 ...
- Java线程中带有返回值的线程Callable
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现C ...
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- Java中传参的值传递和引用传递问题(转)
今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?
java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量? 整数值默认就是int类型,只有在数值常量后面加“L”或“l”才表明该常量是long型
- (转载)Java Map中的Value值如何做到可以为任意类型的值
转载地址:http://www.importnew.com/15556.html 如有侵权,请联系作者及时删除. 搬到我的博客来,有空细细品味,把玩. 本文由 ImportNew - shut ...
- 了解Java基本数据类型的取值范围
拿byte类型做栗子 一个字节是8位二进制数,然后最高位会用来作为符号位.正数计算机是存的原码,负数是存的补码. 也就说byte正数最大是0111 1111,转化为十进制是:127(这就是byte的上 ...
- 理解--->Java中的值传递&引用传递
转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...
随机推荐
- (python)排序算法
一.冒泡排序 1.冒泡排序实现思路 需要两层循环,外层循环控制总共循环几次,内层循环控制交换的次数(注意索引超界的问题). 外层第一次循环,内层第一次循环,将第一个元素(y)与第二个元素(y+1)进行 ...
- mssql sqlserver in 关键字在值为null的应用举例
转自:http://www.maomao365.com/?p=6873 摘要: 下文通过案例分析in 关键字在值为null的应用举例, 分析出not in关键字在null值产生的异常信息 如下所示: ...
- Spring MVC 静态资源处理 (三)
完整的项目案例: springmvc.zip 目录 实例 项目结构: 一.配置web.xml <?xml version="1.0" encoding="UTF-8 ...
- js在前端json字符串和对象互相转化
js在前端json字符串和对象互相转化 //对象转json串 注意:参数必须是对象,数组不起作用,对象格式{'0'=>'a'} JSON.stringify( arr ); //json字符串转 ...
- 管理ESXI网络
一.实验拓扑图: 二.实验目标:部署标准交换机和分布式交换机 三.实验步骤: 标准交换机的配置 1.分别在两台esxi主机中添加6块物理网卡,桥接到vmnet1. 通过宿主机连接到sql-vcente ...
- win10升级后蓝牙不见了,设备管理器里没有,多了个串行控制器里的未知USB设备?
win10更新后,蓝牙功能不见了,也没有打开的选项,设备管理器里也没有,多了个未知USB设备,重启无效,重装蓝牙驱动无效,BIOS中的Bluetooth是开的. 试了网上能找到的所有方法,包括更新wi ...
- June 5. 2018 Week 23rd Tuesday
Learn to let go and be clear of where you really want to head for. 学会放手,同时也要弄清楚自己的真正所爱. From Kissing ...
- March 02nd, 2018 Week 9th Friday
Make hay while the sun shines. 勿失良机. Last night the toothache woke me up and it was very difficult f ...
- [福大软工] Z班 第2次成绩排行榜
作业链接 http://www.cnblogs.com/easteast/p/7469291.html 评分细则 本次个人项目分数由三部分组成,分别是 (1)博客 - 20分,分数组成如下: 在文章开 ...
- sftpdrive mtputty
https://blog.csdn.net/junli_chen/article/details/77527250?locationNum=2&fps=1