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

news/2024/7/3 1:28:56

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

 

1 GetObject(Object& obj)
2 {
3    obj.value = value1;
4 }

 

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

 

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

 

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

 

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

 

1 GetObject(Object* obj)
2 {
3      obj->value = value1;
4 }

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

点评: 同1.

 

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

 

1 Object* GetObject()
2 {
3     Object *a = new Object();
4     return a;
5 }

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

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

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

 

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

 

1 Object GetObject()
2 {
3     Object a;
4     return a;
5 }

 

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

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

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

 

 

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

 

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

1 Object * GetObject()
2 {
3     Object a;
4     return &a;
5 }

 

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

1 Object GetObject()
2 {
3     Object *a = new Object();
4     return *a;
5 }

 


http://lihuaxi.xjx100.cn/news/248484.html

相关文章

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络?CDN,意思是Content Distrubtion Network,意思是内容分发网络,简单的说,就是全地域范围内的负载均衡,全地域的概念可以是全国,也…

你必须知道的.net学习总结

着几天在看《你必须知道的.net》,这次看书和以往不同,以前是把自己喜欢的章节看了。但是这次决定把一本书详细的看看。 在第一章第一节中主要讲的是“对象”,我想每一个程序员都对,“对象”有理解。 我来说说书中所说的对象吧。。 我只是把认…

混沌---

原文链接: 混沌数学及其软件模拟 - 叶飞影 - 博客园https://www.cnblogs.com/WhyEngine/p/3974515.html 混沌数学及其软件模拟这几天在研究混沌,并写了些程序将网上能找到的各种混沌模型以图形的形式显示出来.(一)混沌介绍混沌(Chaos)是指发生…

OpenCV读写YAML/XML文件

1. YAML 1.1. YAML格式 OpenCV识别和YAML格式必须带一个头 %YAML:1.0 --- T_camera_lidar: !!opencv-matrixrows: 4cols: 4dt: ddata: [ -9.9966749413220379e-01, -2.1254345991927007e-02,-1.4599792871676539e-02, -6.2313447310366470e-02,1.5385668712172389e-02, -3.7…

Loadrunner进行md5加密方法

本文主要介绍使用Loadrunner进行字符串md5加密的方法。 使用Loadrunner进行md5比较简单,首先是加载md5.h头文件,后使用头文件中的加密函数即可。 1. md5.h头文件内容如下 #ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #els…

能和LoadRunner匹敌的VS2010/2012Web负载测试

VS自带的Web负载测试真的很大程度上能和专业的loadrunner媲美(只是Web方面),上个report图吧(如何实现,请往下拉): 看,能探测一堆的计数器(上面红色打叉的是代表超过了基线…

》》视频

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title>自定义视频</title><style>* {margin: 0;padding: 0;}font-face {font-family: "iconfont";src: url(iconfont.eot?t1501471609099);/* IE9*/src:…

5.matlab 中的sort

&#xff08;1&#xff09;sort的功能就会排序 默认情况使用升序sort &#xff08;X&#xff0c;DIM&#xff0c;MoDE&#xff09; x是排序的变量 DIM是维度&#xff0c;也就是依据那个维度排序 MORE是排序的方向&#xff1a; ascend 升序 descend降序 &#xff…