快速业务通道

一个C++日期类(第一部分)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
值(参见 Listing 8)。因为具有私有成员是更普遍的情况,我通常用 class 关键字取代struct, 默认情况下其成员为 private (参见 Listing 9)。类似 get_month 这样的 存取函数不改变一个日期类的私有部分,因此我声明它们为 const 成员函数。(Date::interval()也是一个 const ——别忘了在实现文件 date3.cpp 中它的定义前加 const。) 现在我必须用 tdate3.cpp (参见 Listing 10)中的存取函数调用替代数据成员引用。

我们现在在完成一个 C++ 风格的日期类上只走了一半的路。下个月我们会把输入输出流、静态成员和运算符重载结合进来讨论。

C++中的引用

C++中的引用是另一个对象的别名。它所引用的对象出现的地方,它本身就可以出现。下面的程序使用引用iref代替i:

/* ref1.c:   Illustrate references */
#include
main()
{
  int i = 10;
  int &iref = i; // An alias for i

  printf("%d\n",iref);
  iref = 20;
  printf("%d\n",i);
  return 0;
}
/* Output:
10
20
*/

你可以把引用看作一个"灵巧"指针,因为它指向另一个对象却又不像指针一样需要明确的寻址和取值:

/* ptr.c: Do the same thing with pointers */
#include
main()
{
  int i = 10;
  int *iref = &i;

  printf("%d\n" ,*iref);
  *iref = 20;
  printf("%d\n",i);
  return 0;
}
指针和引用的主要区别在于:

你必须用引用所指对象来初始化这个引用。这样的声明是没有意义的(除非作为函数的参数):

int &iref;

一旦初始化了一个引用,你不能使这个引用指向另外的对象。既然引用总是需要指向某些东西,你不能像对指针一样给它赋值为NULL。

引用既不需要也不允许&和*操作符的使用,所有的寻址和取值都是自动的。你可以把引用看作一个const指针,每次使用的时候都会取值。

然而,就像指针一样,引用也可以作为函数的返回值。既然引用被定义成一个左值,这就允许一个很特殊的习惯,那就是在完成某任务时,可以将对函数的调用放在=的左手边:

/* ref2.cpp:  Returning a reference */
#include
int & current();  // Returns a reference
int a[4] = {0,1,2,3};
int index = 0;
main()
{
  current() = 10;
  index = 3;
  current() = 20;
  for (int i = 0; i < 4; ++i)
    printf("%d ",a[i]);
  putchar(''''''''\n'''''''');
  return 0;
}
int & current()
{
  return a[index];
}
/* Output:
10 1 2 20
*/

另一种引用的用法是实现引用传递语义,这意味着在被调用函数返回后改变调用进程中存在的函数参数值。你也可以用指针实现,但是引用更明确:

/* ref3.cpp: 
Swap via references */
#include
void swap(int &, int &);
main()
{
  int i = 1, j = 2;

  swap(i,j);
  printf("i == %d, j == %d\n",i,j);
  return 0;
}
void swap(int &x, int &y)
{
  int temp = x;
  x = y;
  y = temp;
}
/* Output:
i==2, j == 1
*/

即使你不打算修改函数的参数,为了提高效率用引用来传递大的对象也是一个好办法。例如,假如数据类型X很大,

struct X
{
  // lotsa stuff
};
那么具有X类型参数、却不会修改该参数的函数f应该有类似下面的原型:

void f(const X&);

想要了解引用的更多内容,参见 Dan Saks'''''''' 在 1991 年第九期的专栏:

"Reference Types", CUJ Vol.9,No.9。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号