C++类与对象深入之静态成员与友元及内部类详解

C++类与对象深入之静态成员与友元及内部类详解

静态成员

静态成员是指在类中被声明为静态的成员变量或静态的成员函数。静态成员不是直接属于某个对象,而是属于这个类本身。在类定义时,静态成员变量的分配空间并不会影响到对象的大小,只分配一次空间。静态成员函数不能访问非静态成员变量和非静态成员函数,只能访问静态成员变量和静态成员函数。

静态成员变量

静态成员变量是指被 static 关键字修饰的成员变量。在类定义时只声明,不定义,定义需要在类外进行。在定义时需要加上类名和分号。

class A {
public:
    static int x;
};
int A::x = 0; // 类A的静态成员变量初始化

静态成员函数

静态成员函数是指被 static 关键字修饰的成员函数。静态成员函数不需要对象实例即可访问。静态成员函数没有 this 指针。

class A {
public:
    static void func() {
        std::cout << "This is a static function!" << std::endl;
    }
};
A::func(); // 调用静态成员函数

静态成员变量的使用

静态成员变量是被类的所有实例共享的,所以它的值会在不同实例之间保持一致。可以通过 类名::静态成员变量 来访问这个静态成员变量。

class A {
public:
    static int x;
};
int main() {
    A a1, a2;
    a1.x = 100;
    std::cout << a2.x << std::endl; // 100
    std::cout << A::x << std::endl; // 100
}

静态成员函数的使用

静态成员函数不会访问对象实例,不需要 this 指针。静态成员函数可以使用类名调用。

class A {
public:
    static void func() {
        std::cout << "This is a static function!" << std::endl;
    }
};
int main() {
    A::func(); // 调用静态成员函数
}

友元

友元指的是可以访问一个类的私有成员的非成员函数,友元不是类的成员,也不是类的对象。友元可以是普通的函数、类、成员函数、等等。

友元函数

在类定义中,使用 friend 关键字来声明一个友元函数。友元函数可以访问类的私有成员。

class A {
    friend void func(); // 声明友元函数
private:
    int x;
};
void func() {
    A a;
    a.x = 100; // 访问类的私有成员
}
int main() {
    func(); // 调用友元函数
}

友元类

在类定义中,使用 friend 关键字来声明一个友元类。友元类可以访问当前类的私有成员。

class B {
    friend class A; // 声明友元类
private:
    int x;
};
class A {
public:
    void func() {
        B b;
        b.x = 100; // 访问当前类的友元类B的私有成员
    }
};
int main() {
    A a;
    a.func(); // 调用不同类的友元
}

内部类

内部类是指在一个类的内部定义的类,与外部类相比具有更高的封装性。内部类可以使用外部类的所有成员,并且外部类可以使用内部类的所有成员。

静态内部类

静态内部类指的是被 static 修饰的内部类,静态内部类的对象可以直接调用,不需要有外部类的实例。静态内部类不能访问外部类的非静态成员。

class A {
public:
    static int x;
    static class B {
    public:
        static void func() {
            std::cout << "This is a static inner class!" << std::endl;
            std::cout << "x = " << x << std::endl;
        }
    };
};
int A::x = 100;
int main() {
    A::B::func();
}

成员内部类

成员内部类指的是没有被 static 修饰,被定义在一个类的内部的类。成员内部类可以访问外部类的所有成员,包括私有成员。

class A {
public:
    int x;
    class B {
    public:
        B(A& a): a_(a) {}
        void func() {
            std::cout << "This is a member inner class!" << std::endl;
            std::cout << "x = " << a_.x << std::endl;
        }
    private:
        A& a_;
    };
};
int main() {
    A a;
    a.x = 100;
    A::B b(a);
    b.func();
}

以上就是关于C++类与对象深入之静态成员与友元及内部类详解的完整攻略,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类与对象深入之静态成员与友元及内部类详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言中的多态

    多态是面向对象编程中的一个重要概念,但是在C语言中并不是一种原生特性。然而,通过使用函数指针和结构体等技术,我们可以实现在C语言中实现多态。下面是一份详细的使用攻略: 什么是多态 多态是一种可以让不同对象具有不同行为的编程技术,它允许我们使用统一的接口处理不同类型的数据。在面向对象编程中,多态通常是通过继承和方法重写来实现的。在 C 语言中,则主要通过函数指…

    C 2023年5月10日
    00
  • JVM指令的使用深入详解

    JVM指令的使用深入详解 Java虚拟机是Java语言的运行环境,负责执行Java应用程序并提供运行时环境。Java虚拟机具有跨平台性、安全性、动态性、扩展性等优势,是Java程序能够跨平台运行的重要保障。Java虚拟机执行Java应用程序时使用的是Java字节码,Java字节码使用类似汇编语言的JVM指令进行描述。Java虚拟机的JVM指令提供了丰富的操作…

    C 2023年5月22日
    00
  • C++中的编译与链接

    C++中的编译与链接是将源代码转换为可执行文件的过程。它分为三个阶段:预处理、编译和链接。 预处理 预处理是C++编译过程的第一个阶段,该阶段将源文件中的预处理指令处理为有效的C++代码。 预处理器在编译之前会检查源文件并执行以下操作: 处理所有以 “#” 开头的预处理指令。 删除所有注释(// 和 / /)。 将所有 #include 指令替换为相应头文件…

    C 2023年5月23日
    00
  • c/c++快乐算法第三天

    c/c++感受算法快乐(3) 开始时间2023-04-16 22:21:10 结束时间2023-04-17 00:09:34 前言:很好,这周就要结束了,大家都回学校了么,嘻嘻。回顾一下昨天的算法题,1.4抓交通肇事犯运用枚举模拟,1.5兔子产子问题运用迭代循环,1.6牛顿迭代法求方程根迭代循环,1.7最佳存款问题迭代循环。什么是迭代?对计算机特定程序中需要…

    C语言 2023年4月17日
    00
  • C语言中K-means算法实现代码

    下面我们就来详细讲解一下“C语言中K-means算法实现代码”的完整攻略。 一、K-means算法概述 K-means算法是一种聚类算法,它将样本划分为K个簇,每个簇由距离最近的质心(centroid)来表示。算法流程如下: 随机选择K个样本作为初始质心。 将每个样本归为距离最近的质心所在的簇。 重新计算每个簇的质心。 重复2、3步骤,直到质心不再变化或者达…

    C 2023年5月22日
    00
  • Lua中对table排序实例

    Lua中对table排序是一项非常重要的操作,本文将详细介绍如何在Lua中对table进行排序。 Lua中对table排序的方式 Lua中对table进行排序有两种方式,一种是使用table.sort()函数进行排序,另一种是使用自定义排序函数进行排序。 使用table.sort()函数进行排序 table.sort()函数是Lua自带的排序函数,它可以对t…

    C 2023年5月23日
    00
  • JavaScript之创意时钟项目(实例讲解)

    当我们在学习 JavaScript 时,造一些有趣实用的小玩意儿是必不可少的,其中一个非常有意思的项目就是创意时钟。 项目简介 创意时钟是一个以时钟为基础,通过一些奇特的设计和特殊效果,将普通的时钟变成一个有趣的艺术品的项目。在这个项目中,我们将使用 JavaScript、HTML 和 CSS 来构建一个时钟,并添加动画,使它变得更具有趣味性。 前置知识 在…

    C 2023年5月22日
    00
  • C指针原理教程之C快速入门

    “C指针原理教程之C快速入门”是一篇讲解C语言指针的指南,它详细地介绍了C指针的概念、基础与进阶知识,适用于所有初学者或需要加深自己基础知识的人。下面将为你详细讲解这篇攻略。 C指针原理教程之C快速入门:介绍指针 本节主要介绍指针的概念和基础知识,包括定义指针、指针的运算等。同时,本节也将介绍指针的应用,例如数组、函数调用等。 C指针原理教程之C快速入门:指…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部