文档章节

构造函数、析构函数声明为私有和保护

王勋广
 王勋广
发布于 2016/05/02 21:33
字数 752
阅读 25
收藏 0

将构造函数,析构函数声明为私有和保护的,那么对象如何创建?

已经不能从外部调用构造函数了,但是对象必须被构造,应该如何解决,麻烦大家帮忙说明,关于构造,析构函数声明为私有和保护时的用法???

 

提出这个问题,说明你已经对c++有所思考了。


从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。

对于protected的函数,子类的“内部”的其他函数可以调用之。

而对于private的函数,只能被本类“内部”的其他函数说调用。


语法上就是这么规定的,你肯定也知道的咯。

那么为什么有时候将构造函数或者析构函数声明为protected的或者private的?


通常使用的场景如下:

1。如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。例如:

class A

{ protected: A(){}

  public: ....

};

calss B : public A

{ public: B(){}

  ....

};


A a; // error

B b; // ok


2. 如果将构造函数/析构函数声明为private,那只能这个类的“内部”的函数才能构造这个类的对象了。这里所说的“内部”不知道你是否能明白,下面举个例子吧。

class A

{

private:

    A(){  }

    ~A(){ }


public:

    void Instance()//类A的内部的一个函数

    {

        A a;

    }

};

上面的代码是能通过编译的。上面代码里的Instance函数就是类A的内部的一个函数。Instance函数体里就构建了一个A的对象。

但是,这个Instance函数还是不能够被外面调用的。为什么呢?

如果要调用Instance函数,必须有一个对象被构造出来。但是构造函数被声明为private的了。外部不能直接构造一个对象出来。

A aObj; // 编译通不过

aObj.Instance();

但是,如果Instance是一个static静态函数的话,就可以不需要通过一个对象,而可以直接被调用。如下:class A

{

private:

    A():data(10){ cout << "A" << endl; }

    ~A(){ cout << "~A" << endl; }


    public:

    static A& Instance()

    {

        static A a;

        return a;

    }


    void Print()

    {

        cout << data << endl;

    }


private:

    int data;

};


A& ra = A::Instance();

ra.Print();


上面的代码其实是设计模式singleton模式的一个简单的C++代码实现。



还有一个情况是:通常将拷贝构造函数和operator=(赋值操作符重载)声明成private,但是没有实现体。

这个的目的是禁止一个类的外部用户对这个类的对象进行复制动作。

细节请看《effective C++》里面的一个条款。具体哪个条款不记得了。


本文转载自:http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html

王勋广
粉丝 2
博文 10
码字总数 4668
作品 0
衡阳
程序员
私信 提问
求助一个 ICE 的代码

求助啊,大牛们帮帮忙啊? 如下代码看不太懂,加黑字体的部分,教教我啊 class noncopyable /*在命名空间IceUtil中定义一个名为noncopyable的类 */ { protected: //以下为保护类型成员 nonc...

Ann123
2011/04/18
749
3
C++中将构造函数和析构函数定义为private的用意

很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。通常我们都将构造函数的声明置于public区段,假如我们将 其放入private区段中会发生...

Kylen
2012/07/30
1K
0
C++之保护和私有构造函数与析构函数

一、构造函数 1、保护 构造函数定义为protected后,就意味着你不能在类的外部构造对象了,而只能在外部构造该类的子类的对象,比如: class Base { protected: Base() {} ... }; class Deriv...

被使用的文件
2015/11/02
259
0
C++设计类的注意事项

构造函数 如果没有声明构造函数,编译器会定义一个默认构造函数(无参数、无内容),让你可以不初始化来直接创建对象: 但如果定义了某种形式的构造函数,编译器就不会帮你定义默认构造函数了...

Cloudox_
2017/12/13
0
0
要求或禁止基于堆的对象(把构造函数和析构函数声明为private)

《More Effective C++》 条款27: 要求或禁止基于堆的对象 有时你想这样管理某些对象,要让某种类型的对象能够自我销毁,也就是能够“delete this”。很明显这种管理方式需要此类型对象被分配...

徐燕
2011/07/25
181
0

没有更多内容

加载失败,请刷新页面

加载更多

mac下redis安装、设置、启动停止

常用命令说明 redis服务器:redis-server redis客户端:redis-cli redis性能测试工具:redis-benchmark AOF文件修复工具:redis-check-aof RDB文件修复工具:redis-check-rd redis设置临时密...

botkenni
7分钟前
3
0
好程序员web前端分享HTML5常见面试题集锦四

好程序员web前端分享HTML5常见面试题集锦四 1、为什么要初始化CSS样式? 答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面...

好程序员官方
8分钟前
2
0
CDN的网络架构是什么?

CDN网络架构主要由两大部分,分为中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房,边缘主要指异地节点,CDN分发的载体,主要由Cac...

云漫网络Ruan
9分钟前
2
0
pandas入门07---可视化

01 入门 制作提供信息的可视化是数据分析的重要任务之一。首先介绍一下matplotlib库。 import matplotlib.pyplot as pltimport numpy as npdata = np.arange(10)print(data)plt.plot(da...

筠初
10分钟前
2
0
201_PyTorch中文教程:Torch与Numpy互操作

201_PyTorch中文教程:Torch与Numpy互操作 更多参考: https://morvanzhou.github.io/tutorials/ 油管频道:https://www.youtube.com/user/MorvanZhou 依赖软件包: torch numpy Torch的更多数......

openthings
10分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部