1.  引用作为参数的方式传递.

 GetObject(Object& obj)
{
obj.value = value1;
}

特点: 在外部构造一个对象. 把该对象以引用的方式传递到函数中. 从而实现对该对象的改变, 该参数实质是一个[out]类型的参数, 而非[in]类型的参数. 这里的引用可以称为别名.

点评: 这种方式需要特别的注释参数是[Out]还是[In]类型, 防止无用. 另外用Get这样的名称, 一般都是指存在返回值的. 这样会存在理解和沟通的问题. 需要特别注释.

这种方式很值得推荐, 因为函数没有分配内存. 不会涉及到内存的释放操作, 很安全.

2. 用指针的方式, 传递参数,

 GetObject(Object* obj)
{
obj->value = value1;
}

这个方式跟上面的方式完全一致. 指针跟引用(别名)是指上是一个相同的方式. 是指上所指的都是相同的内存区域.

点评: 同1.

3. 函数内部, 在Heap中构造一个对象, 并在外面返回该对象的指针.

 Object* GetObject()
{
Object *a = new Object();
return a;
}

点评:  既然在Heap中构造了一个对象, 准备在哪里将其释放? 是个问题.

这里非常容易造成内存泄漏的, 因为内存分配和释放的原则是: 哪里分配, 就在哪里释放, 显然这里是满足不了要求的.

当然, 上述原则并不绝对(跨模块调用的话, 强烈建议坚持该原则.)

4. 以返回值的方式, 直接返回一个对象.

 Object GetObject()
{
Object a;
return a;
}

点评: a对象会复制一份, 交给返回值.

这样造成的问题是, 需要提供copy构造函数, 否则会出大问题的.

另外,  对象的复制, 进行了大量的工作, 将导致效率下降, 同事栈的空间也被占用. 代价还是比较高昂.

 

//附加一些容易犯的错误.

问题1: 下面的例子的问题是, a对象离开作用域(函数)时, 将可能被自动释放, 造成指针指向的位置被清理的问题.

 Object * GetObject()
{
Object a;
return &a;
}

问题2: 下面的例子, 不但造成了内存泄漏, 并且*a所指的对象仍然被复制了一份. 即引发了效率低下, 以及内存泄漏两个问题.

 Object GetObject()
{
Object *a = new Object();
return *a;
}

C++对象赋值的四种方式的更多相关文章

  1. TP5.1:request请求对象(使用四种方式获取)

    准备: 在index/controller下创建一个名为requests.php的文件(注意:不要起名为request,因为它是关键字,不被允许起名) 动态方法和静态方法的区别: 静态方法:publi ...

  2. 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?

    当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...

  3. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...

  4. 【转】Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...

  5. 关于this绑定的四种方式

    一.前言 我们每天都在书写着有关于this的javascript代码,似懂非懂地在用着.前阵子在看了<你不知道的JavaScript上卷>之后,也算是被扫盲了一边关于this绑定的四种方式 ...

  6. 函数调用的四种方式 和 相关的 --- this指向

    this:表示被调用函数的上下文对象. arguments:表示函数调用过程中传递的所有参数. 这两个参数都是隐式的函数参数.会静默传递给函数,并且和函数体内显式声明的参数一样可正常访问. argum ...

  7. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  8. (转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  9. 【Linux】多线程同步的四种方式

    背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> ...

随机推荐

  1. 【PAT】1011. A+B和C (15)

    1011. A+B和C (15) 给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后给出T组测 ...

  2. Validating a Model

  3. 可随意交换位置的gridview

    自定义gridview import android.app.Activity; import android.content.Context; import android.graphics.Poi ...

  4. 【转】eval()函数用法

    eval 功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source[, globals[, locals]]) -> value 参数: source:一个Py ...

  5. 湖南大学ACM程序设计新生杯大赛(同步赛)D - Number

    题目描述 We define Shuaishuai-Number as a number which is the sum of a prime square(平方), prime cube(立方), ...

  6. 洛谷P3435 [POI2006]OKR-Period of Words [KMP]

    洛谷传送门,BZOJ传送门 OKR-Period of Words Description 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, ...

  7. Mybatis 源码分析之一二级缓存

    一级缓存 其实关于 Mybatis 的一级缓存是比较抽象的,并没有什么特别的配置,都是在代码中体现出来的. 当调用 Configuration 的 newExecutor 方法来创建 executor ...

  8. 【推导】【线段树】hdu5929 Basic Data Structure

    题意: 维护一个栈,支持以下操作: 从当前栈顶加入一个0或者1: 从当前栈顶弹掉一个数: 将栈顶指针和栈底指针交换: 询问a[top] nand a[top-1] nand ... nand a[bo ...

  9. [SimpleOJ233]a xor b

    题目大意: 给你一个数列,求所有区间最大值和次大只异或的最大值. 思路: 很容易想到一个O(n^2)的暴力. O(n)的单调栈做法似乎也很好想,不过考场上没想出来. 对于数列上的某一个数,我们维护在它 ...

  10. Android Studio 2.3更换默认的ConstraintLayout布局

    首先打开你的Android Sudio安装目录,我的为D:\Program Files\Android\Android Studio,进入到以下文件夹\plugins\android\lib\temp ...