`
hello_wangfeng
  • 浏览: 32540 次
社区版块
存档分类
最新评论

用值和用地址传递对象

阅读更多
今天学习《从新手到高手C++全部精华教程》,http://www.iteye.com/topic/1126275

“传值和传地址的区别是,传值由于是传递的原始变量的副本,因此不会改变原始变量的值,而传地址则可以改变原始变量的值。假如仅仅是传递变量的话,采用指针或引用这种传地址的方式的优势并不明显,但是如果传递的是较大的对象的话,那么传地址的优势是十分明显的。这时因为,在用传值的方式传递一个对象时,会像传变量一样建立一个该对象的拷贝,而从函数返回一个对象时,也要建立这个返回的对象的一个拷贝。但是若对象的数据很大时,这种内存的开销是相当可观的。然而,按值传递的开销远不如此,由于在传递对象的过程中需要复制对象,因此会默认调用复制构造函数,该函数就是要创建该对象的副本。同时,若返回的仍是该对象,那么仍按照传值的方式,就又会调用复制构造函数创建该对象的临时副本,当该值成功返回调用程序后,在调用该对象的析构函数删除临时拷贝并释放内存。”

举例如下:

#include<iostream>
using namespace std;

class A{
public:
    A(){cout<<"执行构造函数创建一个对象"<<endl;}
    A(A&){cout<<"执行复制构造函数创建该对象的副本"<<endl;}
    ~A(){cout<<"执行析构函数删除该对象"<<endl;}
};
A func(A one){
    return one;
}
int main(){
A a;
func(a);
    return 0;
}

按值传递对象,如上图所示,结果如下




按地址传递:
按地址传递对象:

#include<iostream>
using namespace std;

class A{
public:
    A(){cout<<"执行构造函数创建一个对象"<<endl;}
    A(A&){cout<<"执行复制构造函数创建该对象的副本"<<endl;}
    ~A(){cout<<"执行析构函数删除该对象"<<endl;}
};
A func(A *one){
    return *one;  //如果是return one;的话,则是错误的,因为one是指针,而函数func的返回类型是对象
}
int main(){
A a;
func(&a);
    return 0;
}

结果如下:




若func函数返回的不是对象,而是指向该对象的指针,则如下:
#include<iostream>
using namespace std;

class A{
public:
    A(){cout<<"执行构造函数创建一个对象"<<endl;}
    A(A&){cout<<"执行复制构造函数创建该对象的副本"<<endl;}
    ~A(){cout<<"执行析构函数删除该对象"<<endl;}
};
A* func(A *one){  //将func函数的返回类型改为指针后,在调用该函数的时候就不用再次调用构造函数了
    return one;  //同时,函数的返回值必须也是指针才可以
}
int main(){
A a;
func(&a);  //按地址传递,则实参必须是地址,所以用&a,同时,形参必须要接收地址,所以是*one
    return 0;
}

结果如下:

  • 大小: 22 KB
  • 大小: 17 KB
  • 大小: 11.1 KB
分享到:
评论

相关推荐

    Java面向对象值传递和引用传递

    值传递和引用传递的区别可以用一个简单的例子来解释:值传递是一样的设计图纸,你可以根据这个设计图纸盖一个新的房子,然后你可以随便修改这个房子,而不影响原来的房子。引用传递是把家门牌号告诉你,然后你来我家...

    值传递和引用传递

    ### 值传递和引用传递详解 #### 一、引言 在计算机编程中,值传递和引用传递是两种常见的参数传递方式。这两种传递方式在不同的编程语言中有不同的实现细节,但其核心概念是相似的。本文将详细介绍值传递和引用传递...

    Java:按值传递还是按引用传递详细解说

    综上所述,在Java中,对于基本数据类型的参数传递实际上是按值传递,而对于对象类型的参数传递则是按引用传递的一种特殊形式——传递的是对象引用的副本,但由于这些副本指向同一个对象,因此对对象的修改会影响到...

    面向对象语言中的值传递与引用传递

    面向对象编程语言中,参数传递主要有两种方式:值传递和引用传递。这两种方式在Java这样的语言中有着明显的区别,理解它们对于编写高效、无误的代码至关重要。 **值传递**: 值传递是Java中处理基本数据类型(如int...

    Java是值传递,传对象引用也是通过值

    总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码至关重要。无论是基本类型还是对象类型,参数传递都是以值的形式进行,但对象类型的值是其引用,允许我们在方法内修改对象的状态,而不影响方法...

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    C++单向按值传递(产生临时对象) 双向按引用传递(不产生临时对象不占任何内存).rar

    2. 安全性:按值传递可以保护实参不被意外修改,如果希望函数不修改实参,应使用按值传递。 3. 返回值:函数可能通过返回值来改变调用者的状态,此时可以结合引用返回,避免额外的对象拷贝。 总结,C++中的按值传递...

    C#笔记值传递和引用传递

    在C#编程语言中,了解值传递和引用传递的概念至关重要,因为这直接影响到函数或方法如何处理参数。本文主要探讨这两个概念以及与之相关的知识点。 首先,值传递是指当一个方法或函数调用时,实际参数(即调用时提供...

    易语言指针传递对象

    因此,在使用指针传递对象时,开发者需要确保正确处理指针,遵循良好的编程实践,以保证程序的安全性和稳定性。 综上所述,"易语言指针传递对象"是一个涵盖多方面技术的主题,包括对象传递、内存操作、DLL交互以及...

    java中只有值传递

    Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。

    详解java的值传递、地址传递、引用传递

    很多开发者对java的值传递和地址传递存在误解,认为java中的基本数据类型是值传递,而对象是地址传递或引用传递。事实上,java中的所有参数传递都是值传递的,而不是地址传递或引用传递。 值传递是指当方法调用时,...

    第04章 面向对象(上) 08 值传递与引用传递

    总之,值传递和引用传递是编程中的基础概念,尤其是在Java这样的面向对象语言中。通过深入理解它们的工作原理,开发者可以更好地控制代码的行为,写出更加高效、健壮的程序。在实际编程过程中,我们需要根据具体需求...

    jni java传递对象到C

    本文将深入探讨如何通过JNI在Java中传递对象到C代码。 首先,我们需要理解Java对象在JNI中的表示方式。Java对象在本地代码中通常被表示为`jobject`指针,这是一个通用类型,可以指向任何Java对象,包括类实例、数组...

    引用和对象的关系,还有值传递

    ### 引用和对象的关系,还有值传递 #### Java中的对象和引用 在Java中,理解和区分对象与对象引用对于编程至关重要。本文将基于提供的内容深入探讨这些概念,并结合值传递这一主题,帮助读者更好地理解Java的核心...

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    JNI 参数传递 Android 自定义对象

    传递自定义Java对象到JNI层则相对复杂,因为需要处理对象引用和对象内部的数据。首先,你需要使用`FindClass`方法获取Java类的本地表示,然后通过`NewObject`创建实例。对于传递的对象,需要定义对应的结构体来存储...

    Android调用webservice进行实体对象的传递Json

    总结,Android调用WebService并使用JSON传递实体对象涉及到多个步骤,包括选择合适的库(如ksoap2和Newtonsoft.Json),理解数据序列化和反序列化的过程,以及正确设置HTTP通信。通过这种方式,你可以高效地在客户端...

Global site tag (gtag.js) - Google Analytics