C++与Java,C#的异同(一):值,地址,引用
2018-06-17 23:22:09来源:未知 阅读 ()
Java,C#已经比较熟悉,最近在从0开始自学C++。学习过程中必然会与Java,C#进行对比,有吐槽,也有点赞。
先来讲讲最基本也是最重要的部分:参数传递的方式。
对于类型, Java分基本类型、复合类型,从另外一个角度分是值类型,引用类型。在展开对比前, 我们先来看看三个关键方式:
-
值
- 创建新的副本,与原来的没有关系
-
地址(指针)
- 把对象所在内存的地址传递过去
-
引用
- 可以理解为变量的别名
举个例子:
1 void testMethodA(int input) { 2 input = 999; 3 } 4 5 void testMethodB(int* input) { 6 //int newValue = 888; 7 *input = 888; 8 } 9 10 void testMethodC(int& input) { 11 input = 777; 12 } 13 14 int main() { 15 16 int input = 111; 17 cout << "Original: " << input << endl; 18 testMethodA(input); 19 cout << "After testMethodA: " << input << endl; 20 cout << input; 21 testMethodB(&input); 22 cout << "After testMethodB: " << input << endl; 23 cout << input; 24 testMethodC(input); 25 cout << "After testMethodC: " << input << endl; 26 27 std::cin.get(); 28 29 // What is the value of input? 30 31 }
运行后的结果:
Original: 111 After testMethodA: 111 111After testMethodB: 888 888After testMethodC: 777
解释一下:
函数 testMethodA 的参数是值传递的,调用函数后,创建了一个input的副本,副本的值改变了, 但是input值没有被改变。
函数 testMethodB 的参数是地址(指针)传递的,函数内修改了input指向的那块内存区域,所以input的值也被改变了。
函数 testMethodC的行为看起来是和函数 testMethodB是一样的, input值也被改变了,他们有什么区别呢?
区别在于:
传递地址,函数内改变的是变量指向的那块内存区域的内容。
传递引用,函数内改变的是变量的指向,换句话说,input指向的内存地址都变了。
如下图:
在C++里面,所有的类型,不管是基础数据类型,结构体,还是类,默认都是“值”传递的;显式声明为指针,才是传地址;显式声明为引用,可以认为就是给变量起了一个别名。
在Java里面,只有基础数据类型(int, double, float等),是值传递的,所有的类对象,都是传地址(注意,不是传引用), 实际上,java里面没有引用传递的概念。
在C#里面, 基础数据类型,结构体, 默认都是值传递;所有的对象, 默认都是传地址;如果想传引用,在参数前面加ref关键字,例如:
1 void testMethodC(ref int input) { 2 input = 777; 3 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:详谈内存管理技术(一)
下一篇:数组指针与二维数组的寻址
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash