C++的封装(十五):第四种访问控制

C++的访问控制有public, protected, private 3种。代表全局允许,子类允许,私有3种访问权限。Java有4种,如果什么都没写,就是默认,代表在同一个包中可以随便访问。初学者对C++的访问控制还没深入理解,使用时常常设置的自相矛盾,弄得自己头大。看到Java有第4种访问权限,觉得Java好,都转到Java去了。

在同一个包中可以随便访问。这在C++当然也根本不是什么难事。

"一个包",也是一个类,比如就叫class Abc好了。包里有3个类, class A, class B, class C,记作:Abc::A,Abc::B, Abc::C。要允许他们之间自由访问,都用friend声明就完了:

cpp 复制代码
class Abc {
public:
        class A;
        class B;
        class C;

        class A {
                int x;
        public:
                int get() {return x;}
                friend class Abc::B;
                friend class Abc::C;
        };
        class B{
                int y;
        public:
                int get() {return y;}
                friend class Abc::A;
                friend class Abc::C;
        };
        class C {
                int z;
        public:
                int get() {return z;}
                friend class Abc::A;
                friend class Abc::B;
        };

private:
	A a;
	B b;
	C c;
};

你可能对用了那么多friend声明有些反感。那么,都用struct就好了,用struct就不用再声明friend了:

cpp 复制代码
class Abc {
public:
        struct A {
                int x;
        public:
                int get() {return x;}
        };
        struct B{
                int y;
        public:
                int get() {return y;}
        };
        struct C {
                int z;
        public:
                int get() {return z;}
        };

private:
	A a;
	B b;
	C c;
};

可是,这里的struct还是不想让外面访问呀。不想让外面访问,把struct搬到private部分去声明就完了。(代码略)

可是,这个类名字和其中的public方法又要允许外面访问呀。要允许外面访问,在公有部分在弄个类继承一下这个struct就完了... 啊?这样搞啊?

最后,这个代码就是下面这种样子。现在,大家都知道,并没有什么java的访问控制好,在C++里办不到这种问题了:

cpp 复制代码
class Abc {
        struct A_dat {
                int x;
        }a;
        struct B_dat {
                int y;
        }b;
        struct C_dat {
                int z;
        } c;
public:
        class A;
        class B;
        class C;

        class A: A_dat {
        public:
                int get() {return x;}
        };
        class B: B_dat {
        public:
                int get() {return y;}
        };
        class C: C_dat {
        public:
                int get() {return z;}
         };

        int geta() {return a.x;}
        void seta(int a) {this->a.x=a;}
        A *ptr() { return (A*)&a; }
};
#include <stdio.h>

int main()
{
        Abc abc;
        Abc::A *pa;

        abc.seta(100);
        printf("%d\n", abc.geta());
        pa= abc.ptr();
        printf("%d\n", pa->get());
        return 0;
}
相关推荐
专家大圣3 分钟前
Bililive-go+cpolar:跨平台直播录制的远程管理方案
开发语言·网络·后端·golang·内网穿透·设计工具
Eiceblue6 分钟前
Python 将 HTML 转换为纯文本 TXT (HTML 文本提取)
开发语言·vscode·python·html
张人玉27 分钟前
C# TCP - 串口转发
开发语言·tcp/ip·c#
苦逼大学生被编程薄纱1 小时前
C++ 容器学习系列|vector 核心知识全解析,铺垫下一期模拟实现
开发语言·c++·学习
ajassi20001 小时前
开源 C# 快速开发(四)自定义控件--波形图
开发语言·开源·c#
DKPT1 小时前
JVM堆大小如何设置?
java·开发语言·jvm·笔记·学习
江公望1 小时前
Qt容器QList、QLinkedList、QVector特性浅谈
开发语言·qt
€8111 小时前
Java入门级教程21——Java 缓存技术、RMI远程方法调用、多线程分割大文件
java·开发语言·java缓存代理模式的实现·java rmi远程方法调用·多线程分割大文件
路弥行至1 小时前
C语言入门教程 | 第四讲:深入理解数制与码制,掌握基本数据类型的奥秘
服务器·c语言·开发语言·经验分享·笔记·其他·入门教程
艾莉丝努力练剑1 小时前
【Linux指令 (一)】Linux 命令行入门:从零开始理解Linux系统理论核心概念与基础指令
linux·c++·经验分享·ubuntu·centos