您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页类的私有private构造函数,为什么要这样做

类的私有private构造函数,为什么要这样做

来源:五一七教育网
类的私有private构造函数,为什么要这样做

通常我们都将构造函数的声明置于public区段,假如我们将其放⼊private区段中会发⽣什么样的后果?没错,我也知道这将会使构造函数成为私有的,这意味着什么?

我们知道,当我们在程序中声明⼀个对象时,编译器为调⽤构造函数(如果有的话),⽽这个调⽤将通常是外部的,也就是说它不属于class对象本⾝的调⽤,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致编译出错。

你于是说:“哈哈。”我们制造了⼀个似乎⽆法产⽣对象的class.哦,当然,对于class本⾝,我们还可以利⽤它的static公有成员,因为它们独⽴于class对象之外,我们不必产⽣对象也可以使⽤它们。嗯,看来我们还是为带有私有构造函数的类找到了⼀个存在的理由。不过我们不应当满⾜于此,因为看上去应当还有发掘的余地。

⾸先我们来认真看⼀下是不是真的⽆法创建出⼀个具有私有构造函数的类对象。“呃,可能未必。”你现在也许会这样说。这很好,让我们再来看看为什么,没错,因为构造函数被class私有化了,所以我们要创建出对象,就必须能够访问到class的私有域;但这⼀点“我们”是做不到的,那么,谁能做得到呢?class的成员可以做得到;但在我们建构出其对象之前,怎么能利⽤它的成员呢?噢,刚才我们刚刚提到了static公有成员,它是独⽴于class对象⽽存在的,当然,它也是公有的,“我们”可以访问得到。假如在某个static函数中创建了该class的对象,并以引⽤或者指针的形式将其返回(不可以以值的形式返回,想想为什么),我们就获得了这个对象的使⽤权。下⾯是例⼦:class WonderfulClass{

public:

static WonderfulClass* makeAnObject() {

// 创建⼀个WonderfulClass对象并返回其指针 return (new WonderfulClass); }private:

WonderfulClass() { }};

int main(){

WonderfulClass *p = WonderfulClass::makeAnObject(); ... // 使⽤*p

delete p; // Not neccesary here, but it's a good habit. return 0;}

嗯,这个例⼦使⽤了私有构造函数,但它运⾏得很好:makeAnObject()作为WonderfulClass的静态成员函数,尽⼼尽责地为我们创建对象:由于要跨函数传递并且不能使⽤值传递⽅式,所以我们选择在堆上创建对象,这样即使makeAnObject()退出,对象也不会随之蒸发掉,当然,使⽤完之后你可不要忘了⼿⼯将它清除。

回到前⾯的思路:除了公有的static成员可以帮助我们访问私有域外,还有没有其它可以利⽤的“东西”? 噢,你⼀定想到了使⽤友元,完全正确。可以使⽤该类的友元函数或者友元类创建其对象,这⾥就不举例了。

我们知道没有⼈会⽆聊到⽆缘⽆故把⼀个class设为私有,然后再写⼀个和上⾯⼀模⼀样的makeAnObject()来让它的⽤户体验⼀下奇特的感觉。我们也不太相信这只是由于C++的设计原因⽽导致的⼀个“顺便的”“特殊的”“⽆⽤的”边⾓功能。它应当是有实际⽤途的。提醒⼀下,到了JAVA中你会更容易明⽩很多静态⽅法创建对象的原理

嗯,例如,我们想实现这样⼀个class:它⾄多只能存在⼀个,或者指定数量个的对象(还记得标准输⼊输出流库中那个独⼀⽆⼆的cout吗?),我们可以在class的私有域中添加⼀个static类型的计数器,它的初值置为0,然后再对makeAnObject()做点⼿脚:每次调⽤它时先检查计数器的值是否已经达到对象个数的上限值,如果是则产⽣错误,否则才new出新的对象,同时将计数器的值增1.最后,为了避免值复制时产⽣新的对象副本,除了将构造函数置为私有外,复制构造函数也要特别声

明并置为私有。

后记:

上⾯的仁兄评论堪称经典,总结⼀下就是为了避免创建对象时调⽤类的构造函数,⽽是想将⽣成对象的⽅式以其它的⽅式实现,则可将所有的构造函数声明为⾮public的,这样并不意味着该类⽆意义,不能实例化⽣成对象。⽣成对象可以两种⽅式:

1. 通过同时为该类声明Public的static成员函数,在该static成员函数中调⽤该类私有的构造函数,⽣成实例,static成员函数是属于任何⼀个对象,⽽是属于类的,故可以在没有该类的对象的情况下,通过<类名>::(参数)的⽅式来实现。

2. 调⽤该类的私有构造函数并⽣成类对象实例还可以通过该类的友元函数,或该类的友元类的成员函数调⽤此私有构造函数来实现。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务