C++构造函数/析构函数 设置成private的原因

2023-10-31

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

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

从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。
对于protected的函数,子类的“内部”的其他函数可以调用之。
而对于private的函数,只能被本类“内部”的其他函数说调用。

语法上就是这么规定的,你肯定也知道的咯。
那么为什么有时候将构造函数或者析构函数声明为protected的或者private的?

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

#include <iostream>
using namespace std;
class A
{ 
protected: 
    A(){}
public:
   void test(){
       cout << "call A test()" << endl;
   } 
};

class B : public A
{
    public: B(){}
    
};

int main(int argc, char** argv)
{
    A a; // error
    B b; // ok
    b.test();
}


 

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静态函数的话,就可以不需要通过一个对象,而可以直接被调用。如下:

#include <iostream>
using namespace std;

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;
};

int main(int argc, char** argv)
{
    A& ra = A::Instance();
    ra.Print();
}


 

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


还有一个情况是:通常将拷贝构造函数和operator=(赋值操作符重载)声明成private,但是没有实现体。
这个的目的是禁止一个类的外部用户对这个类的对象进行复制动作。

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

C++构造函数/析构函数 设置成private的原因 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 2023天梯赛个人题解

    文章目录 L1 1 最好的文档 L1 2 什么是机器学习 L1 3 程序员买包子 L1 4 进化论 L1 5 猜帽子游戏 L1 6 剪切粘贴 L1 7 分寝室 L1 8 谁管谁叫爹 L2 1 堆宝塔 L2 2 天梯赛的赛场安排 L2 3 锦
  • vue通过el-upload组件上传文件到服务器使用总结

    vue通过el upload组件上传文件到服务器使用总结 1 业务需求 vue项目需要通过elementUI的el upload组件上传文件 但是一般情况下请求接口是需要携带token值的 如果不携带则上传不成功 而el upload是通过
  • python为什么叫爬虫?Python和爬虫有什么关系?

    提到Python有同学自然就想到爬虫 但实际上Python和爬虫并不是一个概念的东西哦 下面小千就来给大家介绍一下 爬虫 爬虫又称网络爬虫 又称为网页蜘蛛 网络机器人 在FOAF社区中间 经常的称为网页追逐者 是一种按照一定的规则 自动地抓
  • 【单目标优化算法】沙猫群优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本研究提出了一种新的元启发式算法 称为沙猫
  • mysql第三次上机

    Mysql第三次上机 上机3 1 基于第一次上机创建的银行数据库 创建一个函数 为所有存款账户增加1 的利息 2 创建一个新表branch total 用于存储各个支行的存款总额 表中有branch name和total balance两个
  • 【深入理解Java虚拟机】内存管理和对象访问

    一 JVM内存区域划分 1 程序计数器 线程私有 类似于eclipse中断点程序 行号指示器 记录了程序下一步需要执行的字节码指令 分支 循环等分支 线程私有 每个线程有一个程序计数器 程序计数器是为了多线程情况下 线程执行切换后 处理器回
  • 7大嵌入式开发技巧,你知道吗?

    成为一个正式的工程师 它是一个艰辛的过程 需要开发人员维护和管理系统的每个比特和字节 从规范完善的开发周期到严格执行和系统检查 开发高可靠性嵌入式系统的技术有许多种 今天给大家介绍7个易操作且可以长久使用的技巧 它们对于确保系统更加可靠地运
  • ‘执行力’

    执行力 执行力是一种能力 更是一种态度 很多时候 因为犹豫不决 导致很多不应该发生的事情发生了 从今天起 锻炼自己的执行能力 从生活中的的小事开始 起床铃声响起 不赖床 想到什么就去实践 结果如何那都是后话 如果都不去做 何来的结果
  • [C4W4] Convolutional Neural Networks - Special applications: Face recognition & Neural style transfe...

    第四周 Special applications Face recognition Neural style transfer 什么是人脸识别 What is face recognition 欢迎来到第四周 即这门课卷积神经网络课程的最后
  • javascript 获取 全部cookie(以对象形式返回)

    javascript 获取 cookie 以对象形式返回 建议定义全局变量cookie if document cookie var cookie eval document cookie replaceAll replaceAll els
  • linux vmstat io,Linux下vmstat调优工具的深入分析 (*****)

    vmstat procs memory swap io system cpu r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 310596 24796 1437
  • mybatis概述及搭建

    目录 1 概述 2 mybatis搭建 1 创建一个maven项目 添加mybatis mysql所依赖的jar 2 创建一个数据库表 及对应的java类 3 创建一个mybatis的核心配置文件 配置数据库连接信息 配置sql映射文件 4
  • 【Unity-Cinemachine相机】相机跟随之Transposer属性

    相机跟随和瞄准行为 Transposer 虚拟相机将在某个固定的偏移或距离上跟随目标移动 上面的偏移量就是Follow Offset Binding Mode决定Follow Offset是目标本地坐标系下的身后十米还是世界坐标系下的身后十
  • apache druid学习之Processes and servers

    Processes and servers Apache Druid Process types Druid has several process types Coordinator Overlord Broker Historical
  • 获取代理服务器ip列表的方法

    开源项目 https github com SpiderClub haipproxy 看爬代理的网址列表应该是最多的 CRAWLER TASKS name mogumiao com resource http www mogumiao co
  • MongoDB下载安装教程

    MongoDB下载安装教程 1 下载 2 安装 3 启动mongoDB 3 1 在windows的任务管理器中启动mongoDB 3 2 双击mongo exe 启动mongodb 3 3 在此处输入命令 操作数据库 4 操作mongoDB
  • linux经典面试问题

    你在准备 Linux 面试吗 我们准备了一些常见的 Linux 面试问题及其答案 如果您是初学者 具有一定的 Linux 知识或获得认证 或具有专业的 Linux 管理经验 那么下面的问答有助于您准备面试 1 什么是Linux及基本组件 L
  • java.net.UnknownServiceException: CLEARTEXT communication to www.httpbin.org not permitted by networ

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 在Android9 0系统的手机上访问http的api 出现以下异常 java net UnknownServiceException
  • 理解RoIAlign实际操作

    我们的模型取一个大小为 512x512x3 宽度x高度x RGB 的图像输入 VGG16将其映射为一个 16x16x512的feature map 比例因子是 32 接下来 我们将使用其中一个proposed RoIs 145x200box
  • C++构造函数/析构函数 设置成private的原因

    将构造函数 析构函数声明为私有和保护的 那么对象如何创建 已经不能从外部调用构造函数了 但是对象必须被构造 应该如何解决 麻烦大家帮忙说明 关于构造 析构函数声明为私有和保护时的用法 提出这个问题 说明你已经对c 有所思考了 从语法上来讲