浅谈 c++/java/javascript 之传参

本文主要梳理了几种语言的传参机制,即关于 传值、传引用 之争

最近开始学node.js搭后端服务器时,碰到这样一句话 java只有一种传参机制就是传值

javascript其大部分语法规范取自于JAVA语法规范, 那么这种句话也适用于它,于是也有  javascript只有一种传参机制就是传值

为了理解这句话,我从个人感觉较为接近底层的语言c++写一些测试,代码如下

#include<iostream>
using namespace std;
class Test
{
    public:
        int x;
        Test(int nx);
};

Test::Test(int nx){
    x = nx;
}

void change(Test *qt){
   qt->x = 2;
  Test t(3);
  qt = &t;
}

int main(){
    void change(Test *qt);
    Test t(1);
    Test *qt = &t;
    change(qt);
    cout<< qt->x <<endl;
    return 1;
}

执行结果为2

这里,qt是指针,在change函数中指向一个新的对象后,为什么结果不是输出3呢?

原因是,在这里依然是传值,只不过传递是qt的内存地址,该内存地址指向一个对象,可以在change函数中改变其对象以期main函数的对象产生变化(因为是同个地址指向的同一对象),但如果使用赋值符号赋一个新的对象,传值不会影响到原来的参数

接下来,改成传引用:

void change(Test *&qt){
   qt->x = 2;
  Test t(3);
  qt = &t;
}

int main(){
    void change(Test *&qt);
    Test t(1);
    Test *qt = &t;
    change(qt);
    cout<< qt->x <<endl;
    return 1;
}

执行结果为3

这里传值和传引用都很清楚,那么用javascript写一段例子:

function Test(nx){
    this.x = nx;
}

function change(t){
    t.x = 2;
    t = new Test(3);
}

var t = new Test(1);
change(t);
console.log(t.x);

执行结果为2

从执行结果来看,这里跟c++第一个实例很像,可猜测java/javascript内部实现逻辑应该差不多,当传递的是非基本类型(如数字,boolean)时,将按值传递其对象的地址(字符串也是对象),而之所以说,java/javascript 只有一种按值传递这种方式,是因为其它大部份语言如c++/php都提供了用&传引用的方式

那么,传引用是一个什么过程呢?

比如:

int a = 1; int &b = a;

此时 b 是 a 的一个别名,a和b都是对同一内存块的高级语言的描述标识,在程序执行过程中并没有存放,而是在编绎过程中将全局变量与程序连接起来,

这里涉及到编绎原理,暂时没有深究下去

时间: 2024-12-18 14:00:22

浅谈 c++/java/javascript 之传参的相关文章

[Java]_函数传参的疑惑与思考

问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. 1 void dfs(TreeNode node , int sum , ArrayList<Integer> curPath) 2 void dfs(TreeNode node , int sum , boolean ifExist) 问题:在1号中我可以在方法中修改curPath,在结束函数调用时,变量修改仍然生效.   在2号问题中,我即使在函数中修改了ifExist,结束函数调

java复用和传参

java复用和传参的三种方法总结: (1) 直接在一个类中调用函数 : 1 package test1; 2 3 public class a 4 { 5 public static void getDate() 6 { 7 System.out.println("晨落梦公子"); 8 } 9 public static void main(String[] agrs) 10 { 11 getDate(); 12 } 13 } 这种方法应注意主函数中的调用的的getDate()必须声明

Java函数的传参机制

一 最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了. 我就打算好好理一理java的传参机制,整理一番 二 很多人一听Java的传参,那一定会脱口而出,java都是值传递的.恭喜各位,答对了. 那么,传的是什么值? 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地

浅谈对Java中ThreadLocal类的理解

首先要明确:ThreadLocal不是一个多线程类,或者应该叫做线程局部变量.这从ThreadLocal的JDK定义中就可以看到 public class ThreadLocal<T>extends Object 可以看出ThreadLocal只是一个普普通通的类,并没有继承自Thread或实现Runnable接口. 同时也可以看到ThreadLocal使用了泛型,这样他就可以操作几乎任何类型的数据了.下面说JDK API代码时具体再说. 对此类,看看JDK API中的部分描述: 该类提供了线

javascript Url 传参的坑,base64参数和url参数之间的转移

在url传参时会对特殊字符进行转义,所以通过base64传参是需要进行处理 简单说下base64的使用 1,在项目根目录下安装 npm install --save js-base642,在项目文件中引入 let Base64 = require('js-base64').Base64 import { Base64 } from "js-base64"; 3,在项目文件中使用 Base64.encode('大元') // fdsfds5f34Base64.decode('fdsfds

浅谈用java解析xml文档(四)

继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使用dom4j解析,个人认为是四种解析方式里面最方便的一种,DOM4J是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用D

浅谈用java解析xml文档(三)

接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. JDOM基于树状结构,利用纯JAVA技术对XML文档实现解析.生成.序列化及其它操作. 我们从以下步骤开始解析: (1).通过JDOM的API创建一个SAXBuilder的对象 SAXBuilder saxBuilder

金九银十,浅谈关于java程序员面试的一些事项

本篇博文针对的是应届毕业生以及工作两三年左右的java程序员. 为什么要跳槽? 这是一个很广义的问题,每个人心中都有一份答案. 例如: 公司的待遇不好, 薪资涨幅不符合预期要求, 厌倦了出差的荒无天日的繁重工作, 公司的妹子太少, 领导太傲娇, 同事之间关系太逼格, 某某同学跳槽到某某公司之后涨到了多少多少钱, 某某同学的朋友的同事的三姑妈家的大儿子的好基友在某某高就, 等等辞职理由. 咱们就不多说了,还是谈谈怎么应付面试吧. 以下内容是我在面试中总结的一些经验,希望这些可以给各位带来帮助和启迪

javascript函数传参的思考

今天下午思考了一下调用函数的时候,是怎么样吧参数传给执行的函数.当值的类型不同的时候,又没有变化. 当参数的值是基本类型的时候,这个时候是按值传递的,这个肯定都是清楚的,但是当值是引用类型的时候,这个时候情况又是怎么样的啊. 当我们把一个对象当作参数的时候传递的时候,我们发现怎么运行funx函数,但是全局对象a变量也被修改了,这个时候有些迷惑.参数在传递的时候,不是通过值传递的么,为什么会修改外部环境中的对象的属性.发现这个好像是引用传递.但是,如果我们运行下面这样的函数的时候: 发现输出的结果