`
bardo
  • 浏览: 379342 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11831
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10140
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9529
社区版块
存档分类
最新评论

细说构造函数中的常引用

    博客分类:
  • VC
阅读更多
细说构造函数中的常引用 ( 2006-10-30 19:25 )

    构造函数用于对象的初始化。这一点相信大都明白。但是:构造函数不能被继承,基类是要先初始化的,基类初始化工作如何做?
    C++是通过代码调用,以实现基类初始化在派生类的前面,单一继承的语法如下:
   <派生类名>::<派生类名>(<参数表>):<基类名>::<基类名>(<参数表>)
{
<派生类成员的初始化代码>
}
也就是说:在派生类构造函数后面加上“:”,在后面列出要调用的基类的构造函数。
   如:CMyTrigon::CMyTrigon(int iheight,int iwidth) : CMyRect(iheight, iwidth)
   如果多继承,则加“,”再一一列出要调用的基类的构造函数。列出时要注意按派生的顺序。
    需要注意的是:
    派生类构造函数必须负责读取基类构造函数中所需的参数。如上例,int iheight,int iwidth是读取基类所要的参数。CMyRect(iheight, iwidth)是在派生类读到参数后,对基类派生类的调用。

    C++类的构造函数的参数与普通函数能数一样,同样也有三种形式:
1、实参,即通过值传递。
如:CTrigon(int nWidth,int nHeight)
2、形参,通过指针传递。
如:CRondInTrigon(const CRond *rond,int nWidth,int nHeight)
3、形参,通过引用传递。
如:CRondInTrigon(const CRond &rond,int nWidth,int nHeight)
    为什么要通过形参来传递呢?
    从上面代码就可以发现,当一个类中的成员是另一个类的对象,或者是结构等,我们就必须使用指针或引用。否则,我们没有其它办法传递该类参数。
    这里面有一个非常特别的问题,那就是,凡是通过引用或指针传递的,都需要用常指针或常引用来传。为什么?
    首先要了解,const是做什么用的?const是用来限定变量中的数据不可改变。但是对指针中的地址或引用中的地址无任何作用。也就是说:
    下面的函数将会出错:
void swap(const int *x, const int *y)
{
int tmp=*x;
*x=*y;
*y=tmp;
}
    同样,下列函数一样也会出错:
void swap(const int &x, const int &y)
{
int tmp=x;
x=y;
y=tmp;
}

    原因就在于,const是对数据进行保护,使其不可写。但是,如果我们改变其指针所指的变量,这种改变就不会出错。为什么?指针或引用主要依据地址,而地址是程序中的辅助数据。我们要保护的是数据不能改变。
    如,下面程序就不会出错。但是却有两个典型的错误:
    因为通过指针或引用,我们可以返回多个数据。但我们不能改变指针或引用。下例是要改变指针。则需要用指针的指针才行。同时,下例中返回局部指针也是不对的。因为局部指针在函数运行结束后将不存在。

#include
void nswap(const int *x, const int *y)
{
int m=12;
int n=13;
int *j=&m;
int *k=&n;
x=j;
y=k;
}

main()
{
int m=21;
int n=31;
int *x=&m;
int *y=&n;
nswap(x,y);
printf("%d;%d\n",*x,*y);
}

    那么,我们可以假设,对于传入对象的构造函数,不用const,结果会如何?
    幸运时,你不会出错。但是不幸情况很多。因为,你无法预料,在你的程序中何时改变参数的数值。这时,不想要的结果就出现了。尤其是在派生类的复杂构造函数。
像:CRondInTrigon(const CRond *rond,int nWidth,int nHeight)
这个构造函数,你总不想要,初始化了rond,再构造CRondInTrigon后,发现,你在rond的初始化数据已不是原来的数据吧?有const就会有写保护而及时指出你的错!
    有人说,派生函数中的参数,最好加上const,实际上这种说法是不对的!
    C++还有一种特殊的构造函数,那就是为自己建一副本的构造函数——拷贝构造函数。原因是因为:已有一个在使用的对象,现在要用这个对象的数据重新构造一个新对象。如果将原对象中的数据取出来,则需要调用其中的相关成员函数才行。用拷贝构造函数可以复制指定对象的数据到本对象。
    下面就是一个实例:
//注意:此类不是MFC的CRECT,而是自定义类
CMyRect(const CmyRect &rt) {
    If  (&rt !=this)   //如果rt不是我,这是条件,不能自我复制。
//(这也算是this的一个用法)
{
            //复制成员
            height= rt.GetHeight();
            width= rt.GetWidth();
            left=rt.nleft;
     top= rt.ntop;
}
        }

    在此类构造函数中,一样需要用const进行限定,因为,你只要复制,并不想改变你原有的对象的数据。
    总之,如果你是用指针虞引用传入构造函数,你需要加上const以保护传入的数据。
    当然,需要补充的是,常引用可以使参数有默认值,这也是非常有用的:
像以下代码:
const int &m=2;
编译器先将2赋给临时变量。然后再引用临时变量
即:
int tmp=2;
const int &m=tmp;
由此,我们可以用在函数中,而不是这样写程序,因为这样是没有必要的。下面是样例程序:
#include
int nswap(int &x,const int &y=3)
{

int k=y;
x+=2;
k+=5;
return(x*k);

}

void main()
{
int m=2;
int n=1;
int t=nswap(m,n);
printf("%d;%d;%d\n",t,m,n);
int p=nswap(m);
printf("%d;%d;%d\n",p,m,n);

}
也就是说,以引用传参,是可以有默认值的。要做到有默认值,必须要用常引用才行!

分享到:
评论

相关推荐

    《细说PHP》

    此外,《细说PHP》还可能包含对PHP中常用的设计模式的介绍,设计模式是解决软件设计中常见问题的解决方案。它们可以帮助开发者构建出结构合理、易于扩展和维护的系统。书中可能会讲解一些基础的设计模式,比如单例...

    细说PHP中的CMS

    新的《细说PHP中的CMS》——高洛峰 可以用来进行学习,对于初学PHP的很有好处

    细说php源码

    3. **文件与目录操作**:在《细说PHP》的源码中,我们可能会看到如何读取、写入、创建、删除文件,以及如何操作目录(mkdir, rmdir, chdir等)的示例,这些都是PHP在Web开发中的常见应用。 4. **数据库交互**:PHP...

    细说matlab中的max函数.docx

    MATLAB 中的 MAX 函数详解 MAX 函数是 MATLAB 中一个非常重要的函数,用于寻找矩阵或数组中的最大值。它有多种形式,以下是对 MAX 函数的详细介绍。 一、MAX 函数的几种形式 MAX 函数有五种形式,分别是: 1. ...

    细说javascript函数从函数的构成开始

    正是因为有了这些烦恼才让javascript函数值得我们寻味,我想从函数的构成来细说函数,这听起来像是一句废话,讲任何东西当然是从构成去谈,但是由于javascript函数你确实捉摸不了它的形态,因此这里我是从一个标准...

    高洛峰php细说php4

    由于上传文档大小受到限制只能分卷压缩。 《细说PHP》开发Web应用程序PHP是最理想的工具,易于使用、功能强大、成本低廉、高安全性、开发速度快且执行灵活。...系统地介绍了PHP的相关技术及其在实际Web开发中的应用。

    《细说PHP》光盘源码

    光盘源码中的文件通常包括了书中各个章节的实例代码,这些代码涵盖了PHP的基本语法、流程控制、函数、数组、字符串操作、文件系统交互、数据库连接(如MySQL)、表单处理、会话管理、错误与异常处理、面向对象编程...

    细说php精要版

    《细说PHP精要版》会逐一解析这些常用函数的用法,帮助读者提高编程效率。 安全方面,书中会强调防止SQL注入、XSS跨站脚本攻击等常见Web安全问题的方法,以及如何使用PHP的安全功能,如过滤输入、验证码生成、密码...

    细说linux pdf

    细说linux pdf 兄弟连(lampbrother)李明linux课程pdf

    兄弟连细说Linux PDF 文档

    兄弟连 细说Linux PDF文档。共12个按章节总结

    《细说php》光盘源码

    《细说PHP》是一本深度解析PHP编程语言的书籍,其光盘源码包含了书中所有实例和示例的完整代码,对于学习和深入理解PHP有着极高的价值。这份源码的特点在于注释详尽,可以帮助读者更好地理解每段代码的功能和实现...

    细说PHP配套源码

    源码的学习是提升编程技能的关键步骤,通过分析和研究《细说PHP》中的源码,读者可以更好地掌握PHP的核心概念、函数库以及最佳实践。 首先,源码学习可以帮助我们理解PHP的语法结构。PHP支持多种数据类型,包括字符...

    《细说PHP》配套源码

    11. **Session与Cookie**:这两者是实现用户状态管理的重要工具,源码中可能包含如何设置和使用`session_start()`, `$_SESSION`数组,以及`setcookie()`函数。 12. **函数式编程**:虽然PHP更倾向于面向对象,但也...

    细说php下载 兄弟连

    《细说PHP》通过介绍常见的网络攻击手段以及如何在代码中防范这些攻击,帮助初学者从一开始就养成良好的编码习惯,提升项目的整体安全性。 在学习的道路上,一个详尽、系统的学习资源能够极大地提高学习效率。...

    PHP课件 细说PHP345

    PHP课件 细说PHP

    细说PHP(精要版)part3

    《细说PHP(第2版)》自出版以来,销售一路在同类书籍中领先,已成为PHP学习者首选的工具书。为了可以让读者携带方便及更精准地掌握PHP的重点、要点,同时能使之作为大学计算机系PHP教材普及,特别推出《细说PHP精要...

    细说PHP第二版高洛峰.7z

    - 构造函数和析构函数:`__construct()` 和 `__destruct()` 分别在对象创建和销毁时自动调用。 7. 错误处理和异常处理: - 错误报告:通过 `error_reporting()` 设置错误级别。 - 异常处理:使用 `try...catch` ...

Global site tag (gtag.js) - Google Analytics