传递参数的一般指导原则:

对于使用传递的值而不做修改的函数:

  • 如果数据对象很小,比如内置类型或者小型结构,按值传递。
  • 如果数据对象是数组,只能使用指针,并将指针生命为指向const的指针。
  • 如果数据对象是较大的结构,则使用const指针或者const引用,以提高程序效率。这样可节省复制结构所需的时间与空间。
  • 如果数据对象是类对象,则使用const引用。类设计的语义要求使用引用,传递类对象的标准方式是按引用传递。

对于修改调用函数中数据的函数:

  • 如果数据对象是内置类型,使用指针。
  • 如果数据对象是数组,只能使用指针。
  • 如果数据对象是结构,使用引用或者指针
  • 如果数据对象是类对象,使用引用。

this指针:

this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。每个成员函数(包括构造函数和析构函数)都有一个this指针,this指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式 *this。 this指向的是对象的地址,对象本身则是*this。

局部返回值问题:

在C++ Prier Plus中有这样一段代码(P382~383)

Time Time::Sum(const Time & t) const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / ;
sum.minutes %= ;
return sum;
}

参数是引用,返回值类型不是引用。将参数声明为引用是为了提高效率,减少内存使用。

返回值不能是引用,应为函数创建了一个新的Time对象sum,来表示另外两个Time对象的和,返回对象将创建对象的副本,而调用函数可以使用它。然而若是返回类型为Time& ,则引用的将是sum对象。但显然,sum是局部变量,函数结束内存释放,引用将指向一个不存在的对象。使用返回类型Time意味着程序将在删除sum之前构造它的拷贝,调用函数将得到该份拷贝。

注:上边提到了复制,复制肯定占内存以及影响性能。其实还可以在声明 Time sum 加上static,即

static Time sum; //存疑

复制构造函数的介绍:

http://blog.csdn.net/lwbeyond/article/details/6202256/

如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。

静态成员函数:

静态成员函数是不能通过对象调用的,实际上,静态成员函数不能调用this指针,因其不与特定对象关联。如果静态成员函数在共有部分声明,则可以使用类名和作用域解析运算符来调用它。另外,静态成员函数只能调用静态数据成员。

在构造函数中使用new时应注意的事项:

  • 如果在构造函数中使用了new来初始化指针成员,则应在析构函数中使用delete
  • new与delete相互兼容,new对应于delete,new[] 对应于 delete[]
  • 如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。因为只有一个析构函数,所有构造函数都需与其兼容。
  • 应定义一个复制构造函数, 通过深度复制将一个对象初始化为另一个对象.具体而言,复制构造函数应复制数据,而不是地址。
  • 应定义一个赋值运算符,通过深度复制将一个对象复制给另一个对象。

(以上,参见C++ Primer Plus  Page 447 左右)

最新文章

  1. javascript面向切面
  2. MONO Jexus部署最佳体验
  3. linux tail
  4. iOS新特性引导页
  5. Struts2配置问题java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  6. CSS3 总结-1
  7. C# API 大全
  8. mybatis入门-新手注意问题
  9. POJ 2826 An Easy Problem?![线段]
  10. Ibatis动态(dynamic)查询
  11. table中的一些另类标签
  12. C# string.format用法详解
  13. Confluence 6 使用 Jira 管理用户
  14. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题
  15. 十分钟带你理解Kubernetes核心概念
  16. socket编程的同步、异步与阻塞、非阻塞示例详解
  17. Linux那些事儿之我是Hub(大结局)挂起自动化【转】
  18. Keras中RNN不定长输入的处理--padding and masking
  19. AT&T汇编语言——简单实例及工具演示
  20. rpm 软件包离线安装

热门文章

  1. typescript 第二部分
  2. Python 抓取数据存储到Redis中
  3. EventChannel 原生向Flutter传递数据
  4. OpenCV学习笔记(6)——几何变换
  5. HTML基础之DOM
  6. Nginx搭建动态静态服务器
  7. 阶段3 2.Spring_04.Spring的常用注解_7 改变作用范围以及和生命周期相关的注解
  8. 禁止在DBGrid中按delete删除记录
  9. 将JSON字符串反序列化为指定的.NET对象类型
  10. 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用