`

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++对象模型(2012版本)

    《深度探索C++对象模型》是一本专注于C++底层机制的专著,主要针对2012年的标准进行深入解析。C++是一种多范式、静态类型、编译型、并发型、通用程序设计语言,它以其强大的功能和灵活性而闻名。这本书的目标是帮助...

    C++对象内存布局[归类].pdf

    在C++对象的内存布局中,变量覆盖是指对象的成员变量被重新赋值的过程。在这种情况下,对象的成员变量的值将被覆盖,导致对象的状态发生变化。在C++对象的内存布局中,变量覆盖可能会导致对象的不稳定性,因此需要...

    深度探索C++对象模型.doc

    深度探索C++对象模型是理解C++编程核心概念的关键。C++是一种混合了过程化编程和面向对象编程的编程语言,它的对象模型是其强大功能的基础。在C++中,对象是类的实例,类定义了一组数据成员和成员函数,这些成员函数...

    json字符串转换c++类对象

    4. 将JSON对象转换为C++对象:解析后的JSON对象`j`可以直接赋值给C++类的对象,这得益于nlohmann/json库的模板魔法。假设我们有一个`Person`对象`p`,可以这样转换: ```cpp Person p; p = j.get(); ``` 5. 遍历...

    深入理解C++对象模型

    《深入理解C++对象模型》是一本专门为C++高级开发者准备的经典著作,旨在揭示C++对象模型的底层机制和工作原理。这本书英文版的出现,为那些具备良好英语阅读能力的程序员提供了深入学习C++核心概念的机会。CHM格式...

    《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    《深度探索C++对象模型(Inside The C++ Object Model)》是Stanley B. Lippman的经典之作,这本书深入解析了C++的对象模型,揭示了C++底层的实现细节和工作原理。这篇学习笔记旨在帮助读者理解C++的内存管理、类的...

    面向对象程序设计C++ (4).pdf

    面向对象程序设计是C++的核心...以上是C++中面向对象编程的一些基本概念和关键知识点,包括控制流语句、函数重载、`this`指针、异常处理、运算符重载、类和对象、继承方式等。这些知识对于理解和编写C++代码至关重要。

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

    在C++编程中,对象的复制与对象之间的相互赋值是至关重要的概念,尤其是在处理大量对象实例时。这里我们将深入探讨这两个主题。 首先,我们来理解对象的复制。当需要创建一个与现有对象具有相同属性的新对象时,就...

    C++对象内存布局

    ### C++对象内存布局 #### 1. 最简单的类 在C++中,理解对象的内存布局对于深入学习语言特性非常关键。通过分析一个简单的类`CTest`,我们可以更好地了解对象是如何在内存中分配和组织的。 ##### 1.1.1 赋值语句...

    c++面向对象编程实例大全

    《C++面向对象编程实例大全》是...书中可能还涵盖了构造函数、析构函数、拷贝构造函数、赋值运算符重载、友元等进阶主题,以全面覆盖C++的面向对象编程技术。通过动手实践,学习者可以逐步提升编程能力和问题解决能力。

    c++面向对象程序设计第三版谭浩强教学大纲.pdf

    "C++面向对象程序设计第三版谭浩强教学大纲.pdf" 本资源摘要信息涵盖了C++面向对象程序设计的基本概念、数据存储、程序设计初步、函数、数组、指针、用户自定义数据类型、类和对象的程序设计等方面的知识点。 第一...

    深度探索C++对象模型(清晰版).rar

    1. C++对象模型概述:C++对象模型是C++语言在内存中的表示方式,它涉及到类、对象、成员变量、成员函数、继承、多态等核心概念。理解对象模型有助于优化代码、提高程序效率,并能有效避免潜在的内存问题。 2. 类与...

    c++面向对象考试题即答案

    模板和继承是 C++ 中的两种不同的机制,模板用于生成通用代码,而继承用于实现对象之间的继承关系。 在填空题部分,涵盖了以下知识点: 13. 函数原型(填空题 13)。 函数原型是 C++ 中的一种机制,它用于声明...

    深度探索C++对象模型(清晰版.新).rar

    《深度探索C++对象模型》是一本专注于C++底层机制的权威著作,旨在帮助开发者深入理解C++的对象模型,从而更好地运用和优化代码。这本书详细阐述了C++语言中的类、对象、继承、多态等核心概念在内存中的实际表现形式...

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

    本次实验旨在通过具体示例加深对C++中对象赋值与复制的理解。实验分为两部分,第一部分涉及时间类的实现,包括不同类型的构造函数、成员函数及析构函数的使用;第二部分则是关于学生对象数组的创建与排序。 #### 第...

    深度探索C++对象模型中文清晰版.rar

    《深度探索C++对象模型》是一本专注于解析C++内部对象模型的专业书籍,它为读者提供了深入理解C++语言底层机制的机会。C++是一种强大的、面向对象的编程语言,其对象模型是理解C++行为的基础,包括类、对象、继承、...

    C++面向对象程序设计上机考试题库.pdf

    3. 第三个Box类的实现和第二个类似,只不过是在构造函数中使用了初始化列表的形式来初始化成员变量,这是一种更为高效和推荐的初始化方式。 4. 第四个示例演示了模板类Compare的定义和使用,展示了泛型编程的思想。...

Global site tag (gtag.js) - Google Analytics