当前位置: 首页 > news >正文

转载构造函数声明为Private和Protected

转载http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html
将构造函数,析构函数声明为私有和保护的,那么对象如何创建?
已经不能从外部调用构造函数了,但是对象必须被构造,应该如何解决,麻烦大家帮忙说明,关于构造,析构函数声明为私有和保护时的用法???
提出这个问题,说明你已经对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++》里面的一个条款。具体哪个条款不记得了。

转载于:https://www.cnblogs.com/ztteng/p/3408171.html

相关文章:

  • linux下Sublime的安装与插件推荐
  • 【X-Pack解读】阿里云Elasticsearch X-Pack Graph组件功能详解
  • PHP正则表达式的修饰符
  • HQL的select new map ···语法
  • 使用canvas检测HTML5视频解码错误
  • Android Studio 导出 Jar 给 Unity 使用
  • 数据库关联映射建表(一对一,一对多,多对多)
  • window环境下 恢复odoo数据库备份文件时产生的 Database restore error: Command `psql` not found....
  • ubuntu12.04下Eclipse上集成python
  • 莫名奇妙的异常001:Invalid or unexpected token
  • 通过MCollective更加安全地实现puppet的推送更新功能
  • 匈牙利算法
  • 新站上线后 收录又被删掉的原因
  • 「前端」尚妆 UI 组件库工程实践(weex vue)
  • (转载)虚函数剖析
  • __proto__ 和 prototype的关系
  • css选择器
  • eclipse(luna)创建web工程
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Git同步原始仓库到Fork仓库中
  • iOS | NSProxy
  • javascript 总结(常用工具类的封装)
  • Java深入 - 深入理解Java集合
  • Promise面试题2实现异步串行执行
  • Spark学习笔记之相关记录
  • 阿里研究院入选中国企业智库系统影响力榜
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 普通函数和构造函数的区别
  • 前端代码风格自动化系列(二)之Commitlint
  • 日剧·日综资源集合(建议收藏)
  • 实现菜单下拉伸展折叠效果demo
  • 一个SAP顾问在美国的这些年
  • 用jQuery怎么做到前后端分离
  • 运行时添加log4j2的appender
  • elasticsearch-head插件安装
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • #define、const、typedef的差别
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (十一)c52学习之旅-动态数码管
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 反射的使用
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net 怎么循环得到数组里的值_关于js数组
  • /var/log/cvslog 太大
  • @Autowired多个相同类型bean装配问题
  • @NestedConfigurationProperty 注解用法
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C++]拼图游戏