IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C++] C++之static -> 正文阅读

[C++知识库][C++] C++之static

局部对象

形参和函数体内部定义的变量统称为局部变量

  • 局部静态对象

    令局部变量的生命周期贯穿函数调用以及之后的时间。

    可以将局部变量定义成static类型

    局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。

    代码举例:

    size_t count_calls() {
        static size_t ctr = 0;//调用结束后这个值仍然有效
        return ++ctr;
    }
    

    如果局部静态变量没有显式的初始化,它将执行值初始化,内置类型的局部静态变量初始化为0。

类的静态成员

一些成员与类本身直接相关,而不是与类的各个对象保持关联

  • 声明静态成员

    在成员的声明之前加上static关键字,使得其与类关联起来。

    • 静态成员也可以是public或者private的
    • 静态成员的类型可以是常量、引用、指针、类类型等
    class A {
        public:
        	void caculate() {a += a * b;}
        	static double fun1() {return b;}
        	static void fun1(double);//在类外定义该静态成员函数
        private:
        	std::string name;
        	double a;
        	static double b;
        	static double init_b();
    };
    //每个A对象将包含两个数据成员:name和a。只存在一个b成员,而且b被所有A对象共享
    //静态成员函数也不与任何对象绑定,它们不包含this指针,也不能在static函数体内使用this指针
    

    类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据

  • 使用类的静态成员

    • 使用作用域运算符直接访问静态成员:

      double r;
      r = A::fun1();
      
    • 使用类对象、引用、指针来访问静态成员:

      A aa;
      A *bb = &aa;
      double r;
      r = aa.fun1();//通过A对象或者引用访问静态成员函数
      r = bb -> fun1();//通过指向A对象的指针访问静态成员函数
      
    • 静态成员函数不通过作用域运算符就能直接使用静态成员

      void caculate() {a += a * b;}
      
  • 定义静态成员

    我们既可以在类的内部定义静态成员函数,也可以在类的外部定义静态成员函数。

    当在类的外部定义静态成员函数时,不能重复使用static关键字,该关键字只能出现在类内的声明语句

    指向类外部的静态成员时,必须指明所属的类名

    //在类外定义静态成员函数void fun1(double);
    void A::fun1(double num) {
        b = num;
    }
    
    //在类外定义静态数据成员b
    double A::b = init_b();
    

继承与静态成员

静态类型在编译时是已知的

如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。

如果基类中的静态成员是private的,则派生类无权访问它

class base {
    public:
    	static void fun1();
};
class derived : public base {
	void fun2(derived&);  
}; 

derived derived_obj;
base::fun1();//正确,通过类名访问
derived::fun1();//正确,通过类名访问
derived_obj.fun1();//正确,通过derived对象访问,派生类对象能访问基类的静态成员
fun1();//正确,通过this对象访问
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 11:59:07  更:2021-08-11 12:04:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 6:04:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码