构造函数属性为protected或者private时

2023-10-27

在c++中(不仅限于c++),一个函数被声明为protected或者private时,那也就意味着不能被外部直接调用了:

//类的成员函数add()是private
class cla{
private:
    int add(int a, int b){
        return a + b;
    }

public:
    int my_func(){
        add(5, 6);  //private属性的函数只能在类内部使用
    }
};

int main(void)
{
    cla c;
    //c.add(4, 2);  //private属性的函数不能在类外部使用,error
    c.my_func();    //正确

    return 0;
}
//类的成员函数add()是protected
class cla{
protected:
    int add(int a, int b){
        return a + b;
    }

public:
    int my_func(){
        add(5, 6);  //private属性的函数只能在类内部使用
    }
};

class subCla : public cla
{
public:
    int sun_func(){
        add(6, 6);  //subCla继承于cla,所以它可以访问父类cla的protected属性的add函数,ok
        return 0;
    }   
};

int main(void)
{
    cla c;
    subCla s;

    s.sun_func();   //ok
    c.add(7, 6);    //error

    return 0;
}

总归,对于protected函数,只能造子类内部和本类内部调用,private函数,只能在本类内部中调用。这些都是c++最基础的知识,这里只是顺带提一下。

那么将构造函数/析构函数声明为protected或者private?可以通过以下使用场景来看:
1) 作为类设计者的你,不希望你定义的类(cla)可以生成对象,而是要让调用者定子类subCla来继承cla后,子类可以生成对象。那么就要将cla的构造/析构函数声明为protected,子类subCla的构造/析构函数为public:

class cla{
protected:
    cla(){}
    ~cla(){}
public:
    void my_func(){}
};

class subCla : public cla{
public:
    void func(){
    }
};

int main(void)
{
    cla c;      //error,cla的构造函数是protected,生成对象时该类构造函数要被外界自动得到调用,二者相悖
    subCla s;   //ok,cla的构造函数是protected,可以在子类内部调用,生成对象时该类构造函数要被子类自动得到调用
    return 0;
}

2) 设计类时,如果将类的构造/析构函数声明为private,那么也就说明只能在类的内部去生成本类的对象了:

class cla{
private:
    cla(){}
    ~cla(){}
public:
    void interface(){
        cla c;
    }
};

如上的类是符合语法要求的,但是由于该类不能在外部生成对象,所以interface()这个方法将不能被调用。除非将interface()声明为static:

class cla{
private:
    cla(){}
    ~cla(){}
public:
    static void interface(){
        cla c;
    }
};

int main(void)
{
    cla::interface();

    return 0;
}

这样做的意义貌似也不大,我们需要的是像定义一个对象去调用该类成员方法和成员变量的效果,这样子仿佛就只能使用类中的inteaface()这个函数。其他成员无法操作到。既然如此,我们可以把类内部生成的对象的地址给获取回来,这样不就可以通过地址访问其他成员了。但是特别注意,返回的地址一定不能是在栈上面的,因为一旦interface()函数退出,该堆栈信息就会消失,所以interface()函数内部的生成对象放在静态区:

class cla{
private:
    cla(){}
    ~cla(){}
public:
    static cla* interface(){
        static cla c;
        return &c;
    }
    void my_func(){
        std::cout<<"hello"<<std::endl;
    }
};

int main(void)
{
    cla *p_cla = NULL;
    p_cla = cla::interface();
    p_cla->my_func();

    return 0;
}

其实这已经是设计模式中的单例模式了,

p_cla = cla::interface();
p_cla->my_func();

这两句代码无论调用几次,不论在哪一个文件、函数调用,得到的都是静态区中同一个cla类的对象的地址。

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

构造函数属性为protected或者private时 的相关文章

  • 结构体指针变量使用方法举例

    include
  • 错误:Visual Studio has encountered a problem and needs to close

    我使用VS2008 Qt4 7 4开发时 安装Qt后报出该错误 google了一下解决了问题 原来在安装QT插件不正确导致的 在360软件管家中 卸载了qt win opensource 4 7 4 vs2008 但qt vs addin
  • 移动构造-C++11

    移动构造 移动构造是C 11标准中提供的一种新的构造方法 在现实中有很多这样的例子 我们将钱从一个账号转移到另一个账号 将手机SIM卡转移到另一台手机 将文件从一个位置剪切到另一个位置 移动构造可以减少不必要的复制 带来性能上的提升 有些复
  • c语言中的字符数组和字符串之间的关系

    一 字符串的结束标志 1 很多时候我们都是可以看到相关的内容就是 使用数组来存储字符串 也就是我们经常会使用到sizeof 和这个函数 而 这个函数只是求出当前该数组的最大容量 而不是数组中实际存放的内容 我们一般都是需要使用 0 来表示字
  • C++中派生类对基类成员的三种访问规则

    C 中派生类对基类成员的访问形式主要有以下两种 1 内部访问 由派生类中新增成员对基类继承来的成员的访问 2 对象访问 在派生类外部 通过派生类的对象对从基类继承来的成员的访问 今天给大家介绍在3中继承方式下 派生类对基类成员的访问规则 1
  • cout 格式化输出

    将 cout 的 flag 保存到变量 以便修改后的恢复 ostream fmtflags old cout flag 无参将返回当前 flag 值 cout flag old 恢复到原先保存的值 将 bool 值以 literals 输出
  • “保护”文本框值不被输入(HTML 表单)

    我想知道是否可以为 HTML 文本框分配一个值并保护它 我的意思是使其内容不可修改 这样当提交表单时我 确定 提交的是这个值 顺便说一句 我意识到更简单的方法是不 监听 此输入并仅分配它 但它会派上用场 能够执行上述操作 我希望这个问题足够
  • 帮助理解受保护方法的问题

    我正在阅读Sybex 完整 Java 2 认证学习指南 2005 年 4 月 ISBN0782144195 本书适合想要通过java认证的java开发人员 在了解访问修饰符 以及其他修饰符 一章之后 我发现了以下问题 17 对或错 如果 Y
  • 如何将公共抽象类的子类化限制为同一程序集中的类型,从而允许受保护的成员类型化为内部类型

    这个问题类似于C 内部抽象类 如何隐藏外部的使用但我的动机不同 这是场景 我从以下几点开始 internal class InternalTypeA public class PublicClass private readonly Int
  • 如何访问受保护的数组值?

    您好 我有这个数组 我不确定如何从中获取名称 品牌 图像 令牌值 Gloudemans Shoppingcart CartCollection Object items protected gt Array 1264477c2182cc04
  • 为什么受保护的继承会导致dynamic_cast失败?

    我将 C 基类更改为protected继承和我的dynamic cast s 停止工作 为什么要改变继承protected改变的行为dynamic cast struct Base static Base lookupDerived Act
  • 如何在私有和受保护访问修饰符之间进行选择以封装基类和子类之间的成员?

    我正在尝试一个在我的内部函数中使用私有值的项目 过去我只使用公共参数 但我注意到当使用尽可能多的私有参数时 混淆效果会更好 我的问题是关于家长 儿童课程 在我的主类中 我定义了所有参数如下 public class MyFatherClas
  • 为什么受保护的构造函数会在这段代码中引发错误?

    关于受保护构造函数的一个问题 我了解到受保护的构造函数可以在派生类中使用 然而 我发现下面的代码有错误 为什么会出现这样的情况呢 class A protected A class B public A public B A f new A
  • PHP中如何获取对象的受保护属性

    我有一个对象具有一些我想要获取和设置的受保护属性 该物体看起来像 Fields Form Element Location Object helper gt formText allowEmpty protected gt 1 autoIn
  • ASP.NET - 受保护的变量

    如果我使用受保护的变量 该变量是否存在于整个 Web 应用程序中 或者当用户通过 get 或 post 移动到其他页面时它是否会被删除 我确实知道它无法在其他页面中访问 除非我使用静态变量 但我很好奇它是否存在于整个应用程序中 请告诉我 当
  • “包私有”成员访问不是与默认(无修饰符)访问同义吗?

    我对某些文档使用的术语 package private 以及 默认访问 的用法有点困惑 包私有和默认访问不是都与受保护同义吗 是的 几乎是一样的 protected 修饰符指定该成员只能在其自己的包内访问 与 package private
  • 为什么Java中的Object类包含受保护的方法?

    为什么对象类 https docs oracle com javase 7 docs api java lang Object htmlJava中包含受保护的方法 例如clone https docs oracle com javase 7
  • 从 PHP 子类访问受保护的方法

    我可以使用至少两种基本方法来访问受保护的子类的类方法 parent myMethod this gt myMethod 如果我不需要在子类中重写它 在这种情况下我必须这样做 function myMethod parent myMethod
  • Java 中受保护的访问修饰符

    我在理解java中的受保护访问修饰符 或其背后的设计 时遇到了一些困难 我认为这意味着包访问和通过继承包含抽象成员的类的对象进行访问 我编写了以下示例代码 我发现如果未注释 注释掉的行会产生编译错误 为什么我可以通过 Second 中的 S
  • 与受保护的内部成员的可访问性不一致

    尝试在公共类中创建受保护内部类的受保护内部成员会导致以下问题 可访问性不一致 字段类型 what Class1 ProtectedInternalClass 比字段更难访问 what Class1 SomeDataProvider data

随机推荐

  • 应用层概述、基本原理

    网络应用体系结构 客户机 服务器结构 Client Server C S 点对点结构 peer to peer P2P 混合结构 Hybrid 1 客户机 服务器结构 服务器 7 24小时提供服务 永久性访问地址 域名 利用大量服务器实现可
  • aix安装bff_在AIX中安装与维护软件

    学习内容 在 AIX 中安装与维护软件 学习目标 1 了解安装软件包的含义及命名规则 2 了解 AIX 如何发布补丁 知道自己的 AIX 及已安装软件的版本情况 3 知道如何安装与管理软件及升级 4 会修复损坏的软件 5 知道如何通过 Fi
  • Linux/Windows中根据端口号关闭进程及关闭Java进程

    目录 Linux 根据端口号关闭进程 关闭Java服务进程 Windows 根据端口号关闭进程 Linux 根据端口号关闭进程 第一步 根据端口号查询进程PID 可使用如下命令 netstat anp grep 8088 以8088端口号为
  • java判空方式

    java判空方式 1 数据结构判空 map list set CollectionUtils isEmpty 为空 CollectionUtils isNotEmpty 不为空 2 对象判空 Objects isNull 为空 Object
  • IPv6你知道多少?

    IPv6是什么 互联网协议 IP 地址是分配给连接到互联网的每个设备的数字标识符 从广义上讲 IP地址允许设备相互通信并交换信息 Internet协议版本4 IPv4 于1983年发布 至今仍用于大多数Internet通信 IPv4地址使用
  • MongoDB.WebIDE:升级版的Mongodb管理工具

    很早以前收藏了一片文章 强大的MongoDB数据库管理工具 最近刚好要做一些MongoDB方面的工作 于是翻出来温习了一下 用起来也确实挺方便 不过在使用过程中出现了一些个问题 加上更喜欢MongoUVE的操作习惯 于是决定 自己动手 丰衣
  • Java之object和string的理解

    Java之object和string的理解 文章链接http blog csdn net qq 16628781 article details 65036244 知识点 栈区 堆区和方法区 object类clone 和qeuales 方法
  • dubbo之mock模拟

    1 写在前面 考虑这样的场景 当服务提供者还没有开发完毕或者是因为某些原因无法启动时 会导致服务消费者方的停滞 此时为了能够正常的开发测试 可以使用mock功能 在服务消费者端提供一个服务接口的mock实现类 来模拟调用服务提供者正常获取结
  • RCE高危漏洞预警:CVE-2021-40444简要分析

    漏洞影响及其危害 未经身份验证的攻击者可以利用该漏洞在目标系统上执行代码 Microsoft发布了一份关于此漏洞的官方公告 这篇博客文章讨论了该漏洞如何发挥作用 我们已获得多个利用此漏洞的文档样本 文档包中的document xml rel
  • JSONP 教程

    本章节我们将向大家介绍 JSONP 的知识 Jsonp JSON with Padding 是 json 的一种 使用模式 可以让网页从别的域名 网站 那获取资料 即跨域读取数据 为什么我们从不同的域 网站 访问数据需要一个特殊的技术 JS
  • CTFHUBWeb技能树——信息泄露writeup

    web之信息泄露 一 目录遍历 二 PHPINFO 三 备份文件下载 1 网站源码 2 bak文件 3 Vim缓存 4 DS Store 四 Git泄露 1 Log 2 Stash 3 Index 五 SVN泄露 六 HG泄露 一 目录遍历
  • 一口气用Python写了13个小游戏(附源码)

    今天给大家分享13个游戏源码 可以自己复现玩玩 研究下里面的编程逻辑 对学习编程 特别是初学者 应该会有很大帮助 1 吃金币 源码分享 import os import cfg import sys import pygame import
  • 做自媒体创作,这些坑你都踩过吗?快来避雷

    做自媒体以来 我经历过不少误区 走了很多弯路才觉悟出来 这里分享给大家 看看你有没有踩坑 1 不要把涨粉放在第一位 粉丝多少不是关键 20万粉丝的创作者我也有接触 几乎无变现能力 2 标题和封面的重要性 我以前愿意花几个小时写一篇文章 或者
  • nginx脚本

    将wget下载nginx 1 22 0 tar gz包 直接复制到文本中 添加执行权限 chmod 744 脚本名称 脚本名称或sh 脚本名称 执行脚本 bin bash shijian 20220717 xingming zs echo
  • Linux基础笔记

    文章目录 一 Linux目录结构 二 vi 和 vim 1 三种方式 2 基础操作 三 Linux基础命令 1 关机 重启 2 登录 注销 3 用户管理 4 运行级别 5 帮助指令 6 文件目录指令 7 压缩 解压 8 组管理 9 权限管理
  • Python大神给免费分享一个爬取12306火车票例子(附源码)

    上面是以前写的文章的资源 在以前的文章中有对应的资源 有兴趣的可以去查看 作为一种便捷地收集网上信息并从中抽取出可用信息的方式 网络爬虫技术变得越来越有用 使用Python这样的简单编程语言 你可以使用少量编程技能就可以爬取复杂的网站 如果
  • vue中使用video插件vue-video-player

    进入我们的项目文件夹中 并打开命令行窗口 然后进行下面的步骤 1 安装vue video player 输入命令 npm install vue video player S 2 引入插件 在项目的入口文件main js中引入插件 如下 i
  • synopsys-SDC第六章——生成时钟

    synopsys SDC第六章 生成时钟 时钟派生方式 create generated clock edge divide multiply edge shift 多同源时钟 使能组合路径 其他注意事项 之前准备了一段时间的秋招 好久没有
  • java接入apiv3微信小程序支付(以java的eladmin框架为例)

    一 需要准备的资料 1 小程序AppID 如 wx2e56f5 2 商户号 如 1641 3 商户API私钥路径 什么是商户API证书 如何获取商户API证书 获取文件如下图 如 本地路径 E Env eladmin cert c2 api
  • 构造函数属性为protected或者private时

    在c 中 不仅限于c 一个函数被声明为protected或者private时 那也就意味着不能被外部直接调用了 类的成员函数add 是private class cla private int add int a int b return