C++构造函数是否可以定义为private

2023-11-04

思考下:什么时候构造函数需要定义为private?

1,如果一个类的构造函数只有一个且为private,这是可以编译通过的;

class Parent
{
private :
    Parent()
    {
        cout<<"parent :private"<<endl;
    }
};


2,如果一个类的构造函数只有一个且是private,如果类的内部没有专门创建实例的代码,则是无法创建任何实例的;

class Parent
{
private :
    Parent()
    {
        cout<<"parent :private"<<endl;
    }
};

int main()

{

  Parent parent=new Parent();

}

则此程序无法运行

3,如果一个类的构造函数只有一个且是private,如果类的内部有专门创建实例的代码,则只能创建一个或多个实例(根据类内部声明的成员对象个数来定)

class Parent
{

private:

static Parent * parent1;

static Parent * parent2;
    Parent()
    {
        cout<<"parent :private"<<endl;
    }

  static Parent*  GetInstace1()

  {

     if(parent1!=NULL)

     return parent1;

else

     parent1=new Parent();

    return parent1;

  }


  static Parent*  GetInstace2()

  {

     if(parent12=NULL)

     return parent2;

else

     parent2=new Parent();

    return parent2;

  }


};

Parent * Parent::parent1;

Parent * Parent::parent2;

int main()

{

  Parent *parent=Parent::GetInstance1();

}

这样就可以得到一个实例parent1,或者调用GetInstance2()得到另外一个实例;

此处注意:静态成员变量必须要定义,要初始化;即在内部声明之后,外部必须要初始化。

3,如果一个类的构造函数不止一个,如果其中有一个为Private而且也有参数  例如:private: Parent(int val){}外部初始化时必须要加参数  例如 Parent * Parent::parent(3);

4,如果一个类的构造函数不止一个,private 构造函数如果参数 为void(无参),则子类无法编译;换言之,如果一个类构造函数只有private且存在子类,则无法编译,除非父类构造函数为public。

#include<iostream>
using namespace std;

class Parent
{
private :
    static Parent p1;
    static Parent p2;
    Parent(int val)
    {
        cout<<"CONSTRTCTOR  Private(int val) function in  class PARENT Start :"<<endl;
        cout<<"parent :private"<<endl;
        cout<<"CONSTRTCTOR  Private(int val) function in  class PARENT End :"<<endl;
    }

    void Test(void)
    {
        cout<<"Test() function in  class PARENT Start :"<<endl;
        cout<<"Test"<<endl;
        cout<<"Test() function in  class PARENT End :"<<endl;
    }
public  :
    Parent()
    {
        cout<<"CONSTRTCTOR  Public(int val) function in  class PARENT Start :"<<endl;
        cout<<"parent :public now and here"<<endl;
        cout<<"CONSTRTCTOR  Public(int val) function in  class PARENT End :"<<endl;
    }

    static Parent* GetInstance_1(int val);
    static Parent  GetInstance_2(int val)
    {
        if(&p2!=NULL)
        {
            cout<<"p2:"<<&p2<<endl;
            return p2;
        }
        p2=*(new Parent(val));
        cout<<"p2:"<<&p2<<endl;
        return p2;
    }

    static Parent& GetInstance_3(int val)
    {
        if(&p1!=NULL)
        {
            cout<<"p1:"<<&p1<<endl;
            return p1;
        }
        p1=*(new Parent(val));
        cout<<"p1:"<<&p1<<endl;

        return p1;
    }

    void print(void)
    {
        cout<<"Print() function in  class PARENT Start :"<<endl;
        cout<<"p1:"<<&p1<<endl;
        cout<<"p2:"<<&p2<<endl;
        Test();
        cout<<"Print() function in  class PARENT End :"<<endl;
    }

};
Parent Parent::p1;
Parent Parent::p2;
Parent*  Parent::GetInstance_1(int val)
{
    if(&p1!=NULL)
    {
        cout<<"p1:"<<&p1<<endl;
        return &p1;
    }
    p1=*(new Parent(val));
    return &p1;
}

class Child : public  Parent
{
private :
    static Child child_1;
    Child(int val)
    {
        cout<<"CONSTRTCTOR  Private(int val) function in  class CHILID Start :"<<endl;
        cout<<"child "<<endl;
        cout<<"CONSTRTCTOR  Private(int val) function in  class CHILID End :"<<endl;
    }

    void Test(void)
    {
        cout<<"Test private function in  class CHILID Start :"<<endl;
        cout<<"test child"<<endl;
        cout<<"Test private function in  class CHILID Start :"<<endl;
    }

public:
    Child(){}

    static Child & GetInstance()
    {
        return child_1;
    }

    static Child  GetInstance_origin()
    {
        return child_1;
    }
    void print()
    {
        Test();
    }

};

Child Child::child_1;


class A
{
private:
    static A m_ins;
public:
    static A* GetInstance();
private:
    A()    
    {
        cout<<"private A() has been motived"<<endl;
    }
};

A A::m_ins;

A* A::GetInstance()
{
    cout<<"GetInstance"<<&m_ins<<endl;
    if(&m_ins!=NULL)
    {
        cout<<"good"<<endl;
    }
    else
    {
        cout<<"bad"<<endl;
        m_ins= *(new A());
        cout<<"new A() \n the addr of m_ins is "<<&m_ins<<endl;
    }
    return &m_ins;
};

int main()
{
    A *a=A::GetInstance();
    cout<<"In main the addr of A * a ="<<a<<endl;
    Parent * parent1=Parent::GetInstance_1(2);
    parent1->print();
    //Parent* parent1=Parent::GetInstance_1(4);
    /*Parent parent2=Parent::GetInstance_2(5);
    Parent& parent3=Parent::GetInstance_3(6);
    */
    Child child=Child::GetInstance();
    return 0;
}

现在解决开始的问题:当构造函数是private主要是想让类中存在一个公共的类对象,也许是唯一的一个也许是共享的一个

note:

1,void可以作为函数定义形参数但是不可以作为调用参数;

2,类的内部调用完全无阻碍,不管任何保护类型都可以互相调用;但是static 成员函数不可以调用非static成员函数;换言之,public private protected是访问类型,而static是存储类型。

3,   类内部自身的实例成员一般为static,否则难以创建成功,会默认为int;这个比较费解,建议专门花时间理解。

4,如果一个有非空返回类型,但是函数体内部为空,则会得到一个空;编译可以通过,调用有问题;

5,类内成员函数 在内部定义和在外部定义的差别 ???类内部成员变量在内部定义和外部定义的差别; static 成员在类内部是声明,在外部是定义。

6,当你的Student继承自某个类,而这个类没有缺省构造函数(包括类成员无缺省构造),你就不得不用这种语法(subClass():parentclass())了,这个时候就不能放在大括号里了。一个类的构造函数加冒号跟 "a数据成员的构造函数 "或者 "b父类的构造函数"。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++构造函数是否可以定义为private 的相关文章

  • 我可以使用反射更改 C# 中的私有只读字段吗?

    我想知道 由于很多事情都可以使用反射完成 我可以在构造函数完成执行后更改私有只读字段吗 注 只是好奇 public class Foo private readonly int bar public Foo int num bar num
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn

随机推荐

  • java实现解析html网页爬虫

    java解析html需要用到jsoup库来爬虫 Jsoup是一个流行的开源库 用于解析 操作和遍历HTML文档 它提供了类似于jQuery的API 方便地选择和操作HTML元素 其操作非常像jQuery的写法 下面就来详细介绍一下怎么爬数据
  • Android(java)学习笔记24:自定义异常类

    1 自定义异常 考试成绩必须在0 100之间 很明显java没有对应的异常 需要我们自己来做一个异常 自定义异常 继承自Exception 继承自RuntimeException 下面是一个代码示例 package cn itcast 08
  • 组件化icon,来实现根据传入数据不同而显示不同图标代码。

    目标 把classMap显示不同的icon功能抽象成一个组件 分析 需要传入的参数有icon尺寸 icon种类 所以下面icon vue里面定义了2个参数size和type 由父组件传入 难点 css代码层叠关系这里要理清 另外vue中绑定
  • 基于MATLAB的数字图像处理仿真软件

    1 引言 1 1MATLAB介绍 MATLAB是矩阵实验室 Matrix Laboratory 的简称 是美国MathWorks公司出品的商业数学软件 用于算法开发 数据可视化 数据分析以及数值计算的高级技术计算语言和交互式环境 主要包括M
  • ubuntu安装SDK

    1 下载SDK tools package https developer android com studio index html 2 解压文件 进入tools bin文件夹 sdkmanager list sdk root home
  • 测试基础-动态白盒测试

    1 动态白盒测试 定义 也称结构化测试 利用查看代码功能 作什么 和实现方式 怎么做 得到的信息来确定哪些需要测试 哪些不需要测试 如何开展测试 动态白盒测试包括以下4个部分 直接测试底层函数 过程 子程序和库 以完整程序的方式从顶层测试软
  • 8个高效Python数据分析的技巧(附完整代码)

    本文为你介绍了8个使用 Python 进行数据分析的方法 不仅能够提升运行效率 还能够使代码更加 优美 01 一行代码定义List 定义某种列表时 写For 循环过于麻烦 幸运的是 Python有一种内置的方法可以在一行代码中解决这个问题
  • 企业微信开发实战(一、相关说明及注册企业微信)

    文章目录 一 写着前面 1 说明 2 环境 二 注册企业微信 源码 赞赏 一 写着前面 1 说明 1 官方文档地址 https open work weixin qq com api doc 90001 90143 91201 2 大部分描
  • 排序算法总结(Python版)

    经典排序算法总结与实现 经典排序算法在面试中占有很大的比重 也是基础 为了未雨绸缪 这次收集整理并用Python实现了八大经典排序算法 包括冒泡排序 插入排序 选择排序 希尔排序 归并排序 快速排序 堆排序以及基数排序 希望能帮助到有需要的
  • Spring Boot 中的异步调用

    Spring Boot 中的异步调用 通常我们开发的程序都是同步调用的 即程序按照代码的顺序一行一行的逐步往下执行 每一行代码都必须等待上一行代码执行完毕才能开始执行 而异步编程则没有这个限制 代码的调用不再是阻塞的 所以在一些情景下 通过
  • 操作系统复习1

    1 操作系统的特征 并发 共享 虚拟 异步 1 并发 并发与并行的区别 并行 指两个或多个事件在同一时刻发生 并发 指两个或多个事件在同一时间间隔内发生 并发指在一段时间内宏观上有多个程序在同时运行 但在单处理机系统中 每一时刻却仅能有一道
  • display属性_使用这些不太常用的 CSS 属性,让我在前端布局效率上,又提高了一个层次!

    有很多CSS属性 有些人不了解 或者他们了解它们 但是忘记在需要时使用它们 其实 有时候我们用 JavaScript 来实某些交互 CSS 一个属性就能搞定了 这可以大大节约我们编码的时间 作为前端开发人员 我们经常会遇到这样的事情 所以我
  • python爬取微信好友信息

    1 准备工作 平台 windows python版本 Python3 6 IDE Pycharm5 0 2 所使用的第三方库 wxpy 想要获取微信好友的信息 只能在登录成功后才能获得 常见应用场景 控制路由 只能家具等具有开放接口的物品
  • Finding a needle in Haystack:Facebook's photo storage的理解

    博客的所有内容都是个人理解 难免有理解错误的地方 欢迎大家多多拍砖 这是facebook发在OSDI上的一篇论文 讲述了facebook用于存储用户图片的系统Haystack 目前facebook存储了260billion图片 而图片文件显
  • pod状态

    Pending 该Pod已被Kubernetes系统接受 但是尚未创建一个或多个Container映像 这包括计划之前的时间以及通过网络下载图像所花费的时间 这可能需要一段时间 Running Pod已绑定到节点 并且所有容器都已创建 至少
  • 不习惯的 Vue3 起步三 の computed 和 watch

    计算属性和侦听器 Computed计算属性 在模板内表达式非常简单 如果在模板内放入过多的逻辑会使得模板过重并且难以维护 示例
  • deepsort代码改进

    DeepSORT是一个非常流行的多目标跟踪算法 但是可以通过对其代码进行改进来提高其性能和适应性 以下是一些DeepSORT代码改进的建议 使用更好的特征提取器 DeepSORT使用卷积神经网络 CNN 来提取特征 但是可以尝试使用更好的C
  • js绑定键盘快捷键实战

    下面这个函数用来响应键盘事件 标签相应onkeydown事件后调用这个函数就可以实现按键的转换功能 设置快捷键绑定function setShortcutBinding var a window event keyCode if a 8 退
  • 观点

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文作者认为 深度学习只是一种计算机视觉工具 而不是包治百病的良药 不要因为流行就一味地使用它 传统的计算机视觉技术仍然可以大显身手 了解它们可以为你省去很多的时间和烦恼
  • C++构造函数是否可以定义为private

    思考下 什么时候构造函数需要定义为private 1 如果一个类的构造函数只有一个且为private 这是可以编译通过的 class Parent private Parent cout lt lt parent private lt