引用类型参数应该注意的一点问题

简介:

    当参数是引用类型并且是以传值的方式传入参数的时候,方法传入的是这个对象的引用的一个副本,相当于是以一个引用的值按照传值的方式调用方法。这个引用在方法内部会生成一个副本,就像普通的值类型变量一样,但是由于这个引用的副本和原来方法外面的类型的引用是指向了同一个对象,所以方法内部对这个对象进行的各种操作(改变对象的属性等)看上去就像是按引用传递变量了,返回之后对象会发生变化。但是如果在方法内部对这个引用的副本进行了赋值操作,那么这个引用的副本就不再指向原来的对象了,方法返回后,原来的对象自然也不会发生变化。

    Python解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding:utf-8 -*-
 
lst  =  [ 1 2 3 ]
 
def  func1(lst):
     lst.append( 4 )
 
def  func2(lst):
     lst  =  lst[: - 1 # 赋值操作,lst不再指向原来的对象了
     print (lst)
 
func1(lst)
print (lst)  # lst = [1, 2, 3, 4], 函数内改变lst的属性,同样反应到了函数外的lst变量
 
func2(lst)
print (lst)  # lst = [1, 2, 3],

    结论:在函数的调用中,传入引用类型做参数的时候,它仍然是以值传递的方式传递参数的,只不过传入方法内部的是对象的引用的值。同样的,C#和Java也有相同过的问题。C#可以增加ref关键字来解决这个问题。



本文转自 许大树 51CTO博客,原文链接:http://blog.51cto.com/abelxu/1977319,如需转载请自行联系原作者
相关文章
|
7月前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。
|
存储 安全 编译器
C++函数重载及引用
C++函数重载及引用
74 0
|
7月前
|
Java
JavaSE——JDK8新特性(2/2):方法引用(静态方法的引用、实例方法的引用、特定类型的方法引用、构造器引用)
JavaSE——JDK8新特性(2/2):方法引用(静态方法的引用、实例方法的引用、特定类型的方法引用、构造器引用)
42 0
|
存储 自然语言处理 安全
C++——函数重载,引用
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:C++ 🔥<3>创作者:我的代码爱吃辣 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
101 0
|
安全 编译器 C语言
C++程序设计——函数重载、引用
C++程序设计——函数重载、引用
175 0
C++程序设计——函数重载、引用
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
使用final关键字修饰一个变量时,是指引用变量不能变,但是引用变量所指向的对象中的内容还是可以改变的。
421 0
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
|
C++
【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
319 0
【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
|
编译器 程序员 C++
C++中参数需要类型转换,请不要用成员函数
C++中参数需要类型转换,请不要用成员函数
171 0