C++,Java值传递,引用传递
2015-03-06 10:12
127 查看
1.除内置类型、STL迭代器和函数对象采用“pass-by-value”(值传递),其他尽量采用pass-by-reference-const替换
pass-by-value,实现形式“const A&”;
2.Java中的值传递,引用传递问题:
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:Stringstr =“Java”;
C++与Java的区别:也适用于数组
// Test1.cpp : C++ 实现
//
#include "stdafx.h"
#include <iostream>
using std::cout;
class A
{
public:
int num = 1;
};
void changeA(A& a)
{
a.num = 2;
}
void changeAA(A& a)
{
A other;
a = other;
a.num = 3;
}
int _tmain(int argc, _TCHAR* argv[])
{
A test;
cout<<test.num<<std::endl;//输出1
changeA(test);
cout << test.num << std::endl;//输出2
changeAA(test);
cout << test.num << std::endl;//输出3
return 0;
}
</pre><pre class="java" name="code">//Java
package test;
public class Main10 {
private static class A
{
public int num = 1;
}
private static void changeA(A a)
{
a.num = 2;
}
private static void changeAA(A a)
{
a = new A();
a.num =3;
}
public static void main(String[] args){
A test = new A();
System.out.println(test.num);//输出1
changeA(test);
System.out.println(test.num);//输出2
changeAA(test);
System.out.println(test.num);//输出2
}
}
pass-by-value,实现形式“const A&”;
2.Java中的值传递,引用传递问题:
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:Stringstr =“Java”;
C++与Java的区别:也适用于数组
// Test1.cpp : C++ 实现
//
#include "stdafx.h"
#include <iostream>
using std::cout;
class A
{
public:
int num = 1;
};
void changeA(A& a)
{
a.num = 2;
}
void changeAA(A& a)
{
A other;
a = other;
a.num = 3;
}
int _tmain(int argc, _TCHAR* argv[])
{
A test;
cout<<test.num<<std::endl;//输出1
changeA(test);
cout << test.num << std::endl;//输出2
changeAA(test);
cout << test.num << std::endl;//输出3
return 0;
}
</pre><pre class="java" name="code">//Java
package test;
public class Main10 {
private static class A
{
public int num = 1;
}
private static void changeA(A a)
{
a.num = 2;
}
private static void changeAA(A a)
{
a = new A();
a.num =3;
}
public static void main(String[] args){
A test = new A();
System.out.println(test.num);//输出1
changeA(test);
System.out.println(test.num);//输出2
changeAA(test);
System.out.println(test.num);//输出2
}
}
相关文章推荐
- java传递是引用的拷贝,既不是引用本身,更不是对象
- 关于Java的引用和函数参数传递
- java传递是引用的拷贝,既不是引用本身,更不是对象
- Java里的按值传递与引用传递
- Java值传递与引用传递
- java到底是按值传递还是按引用传递?
- java 引用传递与值传递
- Java值传递以及引用的传递、数组的传递!!
- java值传递与引用传递
- Java中的参数传递方式到底是引用传递还是值传递?
- java到底是按值传递还是按引用传递?
- 【JSF心得】JAVA的对象传递是引用传递
- 【JSF心得】JAVA的对象传递是引用传递
- java 值传递 引用传递
- java传递是引用的拷贝,既不是引用本身,更不是对象
- java的值传递和引用传递问题
- 【JSF心得】JAVA的对象传递是引用传递
- 【JSF心得】JAVA的对象传递是引用传递
- java值传递和引用传递
- java中的值传递和引用传递