1. 内部类的概念

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

即说:内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

2. 内部类可以定义在外部类的public、protected、private都是可以的。

如果内部类定义在public,则可通过 外部类名::内部类名 来定义内部类的对象。

如果定义在private,则外部不可定义内部类的对象,这可实现“实现一个不能被继承的类”问题。

3. 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。

  1. class A
  2. {
  3. private: static int k;
  4. int h;
  5. public: class B{
  6. void foo(){
  7. cout<<k<<endl;//OK
  8. //cout<<h<<endl;//ERROR
  9. }
  10. };
  11. };
  12. int A::k=3;

这里cout<<h<<endl;是一个非常常见的错误。因为内部类是一个独立的类,不属于外部类,所以此时还没有外部类的对象,显然也不存在h。而k就不同了,不需要外部类的对象就已存在,所以这里k是OK的。

这和友元类的使用也是同样的道理。“想要使用另一个类的成员,必须要存在这个类的对象”。

  1. class A
  2. {
  3. private: static int k;
  4. int h;
  5. public: class B{
  6. void foo(A a){
  7. cout<<k<<endl;//OK
  8. cout<<a.h<<endl;//OK
  9. }
  10. };
  11. };
  12. int A::k=3;

这样就没问题了。

4. 在堆中创建内部类对象:

  1. class A
  2. {
  3. public: class B{};
  4. };
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7. A::B*b=new A::B();
  8. return 0;
  9. }

5.内部类可以现在外部类中声明,然后在外部类外定义:

  1. class A
  2. {
  3. private: static int i;
  4. public: class B;
  5. };
  6. class A::B{
  7. public:void foo(){cout<<i<<endl;}//!!!这里也不需要加A::i.
  8. };
  9. int A::i=3;

这形式上就更像友元类了。注意这里和友元类,不要混淆了。

6. sizeof(外部类)=外部类,和内部类没有任何关系。

  1. class A
  2. {
  3. public:
  4. class B{int o;};
  5. };
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8. cout<<sizeof(A)<<endl;//1
  9. return 0;
  10. }

总结一下:其实内部类和友元类很像很像。只是内部类比友元类多了一点权限:可以不加类名的访问外部类中的static、枚举成员。其他的都和友元类一样。

https://www.cnblogs.com/aademeng/articles/7264696.html

C++之内部类(内部类就是外部类的友元类,单向友元。只是内部类比友元类多了一点权限)的更多相关文章

  1. java:内部类与外部类的区别和联系

    注意事项一:在内部类中可以随意使用外部类的成员方法以及成员变量. 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止其他类的访问.如在成员变量或者成员方法前面,加上Pri ...

  2. Java内部类与外部类的那些事

    昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...

  3. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  4. java内部类和外部类

    1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world& ...

  5. Java内部类和外部类的通信探索

    1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...

  6. java内部类 和外部类的区别

    java 内部类和静态内部类的区别  详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...

  7. Python内部类,内部类调用外部类属性,方法

    一 Python中内部类 典型定义: class MyOuter: age=18 def __init__(self,name): self.name=name class MyInner: def ...

  8. “全栈2019”Java第七十五章:内部类持有外部类对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第六十九章:内部类访问外部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. LeetCode第63题--不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ).机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”).现在考虑网格中 ...

  2. BZOJ1509: [NOI2003]逃学的小孩 (树形DP)

    题意:给一棵树 选三个点A,B,C 求A到B的再从B到C的距离最大值 需要满足AB的距离小于AC的距离 题解:首先树上的最大距离就想到了直径 但是被样例误导了TAT BC两点构成了直径 我一开始以为A ...

  3. 在做导入一个excel文件的时候,数据有空值的时候

    StringUtil.isNotEmpty(i.getFname()),用这个方法可以解决 java string 去除前后两端的空格和空字符使用.trim()

  4. linux vim 常用操作

    vim 字符级 上k下j左h右i,键盘的方向键也可以移动 单词级 b上个单词首字母 w下个单词首字母 e下个单词的尾字母 行级 0行首 $行尾 删除 dd 删除光标所在行 文档级 gg 文档首行,首个 ...

  5. 最高的奖励 - 优先队列&贪心 / 并查集

    题目地址:http://www.51cpc.com/web/problem.php?id=1587 Summarize: 优先队列&贪心: 1. 按价值最高排序,价值相同则按完成时间越晚为先: ...

  6. <MySQL>入门五 视图

    -- 视图 /* 含义:虚拟表,和普通的表一样使用 mysql5.1版本的新特性,是通过表动态生成的数据,只保存了sql的逻辑,不保存查询的结果 应用场景: - 多个地方用到同样的查询结果 - 该查询 ...

  7. Python爬虫入门教程第七讲: 蜂鸟网图片爬取之二

    蜂鸟网图片--简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度. 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文 ...

  8. 关于构造函数及参数执行顺序说明(c#)

    原文:https://blog.csdn.net/junmail/article/details/83249186 构造函数的执行顺序: 子类静态变量>子类静态构造函数>子类非静态变量&g ...

  9. 【Codeforces 711C】Coloring Trees

    [链接] 我是链接,点我呀:) [题意] 连续相同的数字分为一段 你可以改变其中0为1~m中的某个数字(改变成不同数字需要不同花费) 问你最后如果要求分成恰好k段的话,最少需要多少花费 [题解] dp ...

  10. Android NumberProgressBar:动态移动显示百分比进度的进度条

     Android NumberProgressBar:动态移动显示百分比进度的进度条 NumberProgressBar是github上一个开源项目,其项目主页是:https://github.c ...