首页 > 编程语言 >C++入门到放弃(04)——类的访问权限:public、private、protected

C++入门到放弃(04)——类的访问权限:public、private、protected

时间:2023-07-27 22:11:51浏览次数:44  
标签:04 int private 访问 protected C++ fun public

1.成员访问权限

假定以下类:

class Base{
public:
    // construct function
    Base(int a = 0,int b = 0, int c = 0) : m_public(),m_protected(),m_private() {}

    int m_public;
    void public_fun() { cout << m_public << endl; }
protected:
    int m_protected;
    void protected_fun() { cout << m_protected << endl; }
private:
    int m_private;
    void private_fun() { cout << m_private << endl; }
};

1.1.public

public为公有类型成员,其内部的变量和函数,任何情况下,在类的外部都可以直接访问。

int main() {
    Base b;
    b.m_public++;
    b.public_fun();
}

1.2.private

private为私有类型成员,其内部的变量和函数,任何情况下,在类的外部都不可以直接访问。

int main() {
    Base b;
    //b.m_private++;      // error
    //b.private_fun();    // error
}

1.3.protected

protected为保护类型成员,通常情况下于private类似,在类的外部都不可以直接访问。

但是被继承时,可以在派生类的函数内访问。

int main() {
    Base b;
    //b.m_protected++;      // error
    //b.protected_fun();    // error
}

2.继承访问权限

1.1.public继承

public继承后,访问基类的变量时,相当于成员类型保持不变。

在派生类内部,可以访问基类的public和protected类型的变量和函数。

在派生类外部,只能访问基类的public类型的变量和函数。

class PublicInherit : public Base
{
public:
    void Test() {
        m_public++;     public_fun();
        m_protected++;  protected_fun();
        //m_private++;  private_fun();    //error
    }
};
int main() {
    PublicInherit Public;
    Public.m_public++;
    Public.public_fun(); 
    return 0;
}

1.2.private继承

private继承后,访问基类的变量时,相当于将全部成员类型都变成private。

在派生类内部,可以访问基类的public和protected类型的变量和函数。

在派生类外部,不能访问基类的的变量和函数。

class PrivateInherit: private Base
{
public:
    void Test() {
        m_public++;     public_fun();
        m_protected++;  protected_fun();
        //m_private++;  private_fun();    //error
    }
};
int main() {
    PrivateInherit Private;
    //Private.m_public++;      //error
    //Private.public_fun();    //error
    return 0;
}

1.3.protected继承

protected继承后,访问基类的变量时,相当于将public成员类型变成protected,其他不变

在派生类内部,可以访问基类的public和protected类型的变量和函数。

在派生类外部,不能访问基类的的变量和函数。

class ProtectedInherit : protected Base
{
public:
    void Test() {
        m_public++;     public_fun();
        m_protected++;  protected_fun();
        //m_private++;  private_fun();    //error
    }
};
int main() {
    ProtectedInherit Protected;
    //Protected.m_public++;      //error
    //Protected.public_fun();    //error
    return 0;
}

2.4.总结

继承方式 基类成员特性 派生类成员特性 派生类对象访问
public public public 可以直接访问
public protected protected 不可以直接访问
public private private 不可以直接访问
protected public protected 不可以直接访问
protected protected protected 不可以直接访问
protected private private 不可以直接访问
private public private 不可以直接访问
private protected private 不可以直接访问
private private private 不可以直接访问

3.结构体和类的默认权限

3.1.结构体

结构体默认全部权限为public。

注:结构体也可以使用public、private、protected来强制设置访问权限。

struct Struct {
    int m_member;
    void func() { cout << m_member << endl; }
};
int main() {
    Struct s;
    s.m_member++; 
    s.func();     
    return 0;
}

3.2.类

类默认全部权限为private。

class Class {
    int m_member;
    void func() { cout << m_member << endl; }
};
int main() {
    Class c;
    //c.m_member++; //error
    //c.func();     //error
    return 0;
}


标签:04,int,private,访问,protected,C++,fun,public
From: https://www.cnblogs.com/wyqmx/p/17586238.html

相关文章

  • 有关java语法的一些细节(与c++比较)
    与c++不同,java不支持方法参数的默认值设置,因此若有此需要,可以使用重载的方式去实现,如:publicclassTest{publicintfunc(inta,Stringb){//TODO}publicintfunc(){returnfunc(0,newString("defult"));}...}java中类型转换都......
  • c++学习
    下面的内容都是在linux环境下。网络I/O有阻塞IO,非阻塞IO,IO多路复用,信号驱动IO和异步IO五种方式。1.阻塞非阻塞阻塞与非阻塞针对的是数据就绪阶段,如果是阻塞,则程序将一直等待,知道数据就绪,然后开始读取,如果是非阻塞,则若数据还未就绪,程序可以先执行别的事务,但是I/O还是要......
  • 5、开发环境-调试C/C++控制器
    控制器处理在Webots环境中,Webots应用程序和每个机器人C/C++控制器在不同的操作系统进程中执行。例如,当执行“soccer.wbt”世界时,内存中总共有八个进程;一个用于Webots,六个用于六个玩家机器人,一个用于监督机器人。若要使用MicrosoftVisualStudio调试C/C++控制器,请参阅此处。当控......
  • 《c++徒步》串口篇
    串口和USB串口是指通过串行传输数据的接口,它使用少量的引脚来传输数据。串口通常以RS-232(常见的是DB9或DB25连接器)或RS-485等协议进行通信。串口常用于连接计算机和外部设备,例如调制解调器、打印机、传感器等。USB是一种通用的连接标准,用于连接各种外部设备到计算机或其他主机设......
  • C++中的模板
    1.概念模板是对类型的抽象,为了更好的实现多态的思想。模板分为类模板和函数模板。2.函数模板就是在函数之前声明一下模板,然后执行的时候,函数自行判断推导类型。intadd(inta,intb){returna+b;}doubleadd(doublea,doubleb){returna+b;}//如a......
  • c++ std::thread::joinable
    std:......
  • P3704 [SDOI2017] 数字表格 题解
    一、题目描述:用$f_i$表示斐波那契数列的第$i$项,那么有:$f_0=0,f_1=1;f_n=f_{n-1}+f_{n-2},n\ge2$现在有一个$n$行$m$列的数字表格,第$i$行第$j$列的数字是$f_{\gcd(i,j)}$。求这个表格所有数的乘积。共有$T$组数据,答案对$10^9+7$取模。......
  • c++
    /*#include<iostream>usingnamespacestd;intmain(){intn; intb; intc=0;cin>>n;inta[n];for(inti=0;i<n;i++){cin>>a[i];}for(inti=0;i<n;i++){for(intj=0;j<n-i-1;j++){......
  • c++学习:封装、继承、多态
    c++是面向对象的编程语言,相对于c具有封装、继承、多态的特点。封装定义:封装就是将对象的属性和行为封装起来,形成一个有机的整体,其载体就是类。类通常对客户隐藏其实现细节,这就是封装的思想,就比如我们使用一个库函数时,我们只需要知道它的作用就可以了,没必要去了解它的内部工......
  • 小熊猫 C++ 的 Monokai 改进
    小熊猫目前自带的配色方案Monokai:发现很丑,根本不是想象中的Monokai!!!网上也没有相关的配置,于是自己花了一下午弄了个Monokai:下载地址解压后直接在配色里面导入即可。具体步骤:工具-选项-编辑器配色-导入配色-选中解压后的文件-确定。是不是好看多了?还支持自定义......