`

C++对象赋值的四种方式

 
阅读更多

http://blog.csdn.net/ostrichmyself/article/details/6076434

 

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=对象名2; 注意,对象1和对象2必须是属于同一个类 =========示例代码1.1=============== 代码如下:#include

    C++对象赋值_Project.rar

    C++对象赋值_Project

    C++对象和指针的引用

    //用指针方式给类成员c赋值为3 int (A::*pfun)(int); //定义一个指向类成员函数的指针pfun pfun=A::fun; //给指针pfun赋值 A *p=&x; //定义一个对象指针p,并赋初值为x cout(p->*pfun)(5); //用对象指针调用...

    浅谈C++中对象的复制与对象之间的相互赋值

    主要介绍了浅谈C++中对象的复制与对象之间的相互赋值,是C语言入门学习中的基础知识,需要的朋友可以参考下

    浅谈将子类对象赋值给父类对象

    最近对将子类对象赋值给父类对象有点心得,想和大家分享一下.但本人水平有限,请各位指正和批评. 言归正传,下面是几个小例子,请大家看一看. 测试一 父类:  public class Supclass { public void print() { ...

    C++对象模型在内存中的实现

    C++对象模型在内存中的实现,讲述了类,继承以及虚继承的内存布局;成员变量和成员函数的访问已经访问时的开销情况,包含虚函数的情况,考察构造函数,析构函数,以及特殊的赋值操作符成员函数是如何工作的,数组是...

    C++实验: 对象的赋值与复制

    SetTime根据传递的3个参数为对象设置时间;PrintTime负责将对象表示的实践显示输出,输出格式为“Hour:Minute:Second”。 (1)在主函数中,建立一个时间类对象,设置时间为9点20分30秒并显示该时间。 (2)使用构造...

    C++ Primer第四版【中文高清扫描版】.pdf

    第四部分 面向对象编程与泛型编程 第15章 面向对象编程 471 15.1 面向对象编程:概述 472 15.2 定义基类和派生类 473 15.2.1 定义基类 474 15.2.2 protected成员 475 15.2.3 派生类 476 15.2.4 virtual与其他成员...

    C++面向对象程序设计教程.ppt

    C++面向对象程序设计教程.ppt

    C++类与对象

    1.定义一个学生类Student,学生类中有3个私有数据成员:name(姓名)、cls(班级)、...使用构造函数为Student类的对象赋值(name使用动态内存分配空间),display负责显示学生的基本信息,在析构函数中释放动态分配的内存

    史上最详尽的JsonCpp使用指南(含c++封装的源代码)

    详细介绍如何利用JsonCpp0.5.0生成调试版静态链接库和发行版静态...源代码演示如何封装C++类,使用toJson方法将C++对象转换为json字符串,使用fromJosn方法用json字符串给c++对象赋值。所有源代码都在文档中完整展示。

    详解c/c++赋值函数(重载=号运算符)

    大家都知道c++里的各种运算符都是用函数实现的,比如=就等号函数,所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。下面通过本文给大家介绍c/c++赋值函数(重载=号运算符),感兴趣的朋友一起看看...

    C++实现三维动态数组,赋值加减乘算法

    C++实现三维动态数组,赋值,加减乘算法,适用于三维空间对象之间的运算实现。

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...

    C++实现三维动态数组,赋值,加减乘算法,适用于三维空间对象之间的运算实现

    C++实现三维动态数组,赋值,加减乘算法,适用于三维空间对象之间的运算实现。 3DArray.zip └── 3DArray ├── 3DArray.dsp ├── 3DArray.dsw ├── 3DArray.ncb ├── 3DArray.opt ├── 3DArray.plg ├─...

    C++大整数运算

    C++关于大整数类的相关运算包括重载加减乘除,赋值,输出和比较运算

    C++拷贝构造函数和赋值操作

    C++拷贝构造函数和赋值操作 拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些...

    吉林大学2016年c++期末考试题详解

    多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多...

Global site tag (gtag.js) - Google Analytics