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#的异同(一):值,地址,引用的更多相关文章

  1. atitit。全局变量的设计与实现 java php的异同

    atitit.全局变量的设计与实现 java php的异同 1. 超级全局(Superglobals)"变量 1 2. 全局变量和"global"关键字 1 3. 更加好 ...

  2. Java线程中带有返回值的线程Callable

    在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现C ...

  3. paip.java 多线程参数以及返回值Future FutureTask 的使用.

    paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...

  4. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

  5. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  6. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  7. java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?

    java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量? 整数值默认就是int类型,只有在数值常量后面加“L”或“l”才表明该常量是long型

  8. (转载)Java Map中的Value值如何做到可以为任意类型的值

    转载地址:http://www.importnew.com/15556.html     如有侵权,请联系作者及时删除. 搬到我的博客来,有空细细品味,把玩. 本文由 ImportNew - shut ...

  9. 了解Java基本数据类型的取值范围

    拿byte类型做栗子 一个字节是8位二进制数,然后最高位会用来作为符号位.正数计算机是存的原码,负数是存的补码. 也就说byte正数最大是0111 1111,转化为十进制是:127(这就是byte的上 ...

  10. 理解--->Java中的值传递&引用传递

    转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...

随机推荐

  1. 【PSR规范专题(6)】PSR-7 HTTP消息接口【转】

    PSR-5 和 PSR-6 投票未通过所以直接跳到PSR-7了 本文档描述了在RFC 7230和RFC 7231中被描述来代表HTTP消息通用接口,以及在RFC 3986中规定的URIs语法. HTT ...

  2. 安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

    安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

  3. 后台调用前端JS

    ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script> ...

  4. c/c++ 标准库 插入迭代器 详解

    标准库 插入迭代器 详解 插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的. 例如下面的代码就是错误的: list ...

  5. Lua table笔记

    记录我在使用lua的过程中的一些笔记 默认key为数字递增 local tb={"A",[3]="C","B"} 这个tb通过下标1,2,3 ...

  6. DELL 服务器报CPU 1 has an internal error (IERR)

    重启服务器,然后按F2 进入到bios中,选择system bios settings这个选项,然后选择system profiles 进入,在这个里面麻烦将 C1E 和Cstate这两个选项改为di ...

  7. ASP.NET -- WebForm -- 给图片添加水印标记

    ASP.NET -- WebForm: 给图片添加水印标记 ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面. 1. Test2.aspx文件 <%@ Page ...

  8. Java程序导出成.jar文件、生成.exe可执行文件及打包成可执行安装程序(可在无Java环境的计算机上运行)--以个人所得税计算器为例

    Java程序导出成.jar文件.生成.exe可执行文件及打包成可执行安装程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 需要准备的软件: jdk, ...

  9. 【项目 · Wonderland】会议一 · 可达鸭

    [软件工程实践 · 团队项目] 第一次作业 Part 0 · 简 要 目 录 Part 1 · 队 伍 阵 容 Part 2 · 会 议 记 录 相 关 Part 3 · 会 议 讨 论 记 录 Pa ...

  10. (转)Spring Boot(十八):使用 Spring Boot 集成 FastDFS

    http://www.ityouknow.com/springboot/2018/01/16/spring-boot-fastdfs.html 上篇文章介绍了如何使用 Spring Boot 上传文件 ...