码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-08-24 07:01:32      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   java   os   使用   io   strong   ar   

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

最近开始学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都是对同一内存块的高级语言的描述标识,在程序执行过程中并没有存放,而是在编绎过程中将全局变量与程序连接起来,

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

 

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

标签:style   blog   color   java   os   使用   io   strong   ar   

原文地址:http://www.cnblogs.com/walkfuture/p/3932449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!