首页 > 编程语言 >C++静态成员(static)

C++静态成员(static)

时间:2023-08-24 22:55:13浏览次数:48  
标签:变量 静态 成员 C++ 对象 static 函数

静态成员(static)

什么是静态成员:

被static修饰的成员/成员函数就叫静态成员,不管有多少对象,静态成员只有一份存于公共内存中。

设计静态数据成员目的是信息共享和信息交流

普通成员特点:

  • 成员变量:每个类对象中都有一份属于自己的成员变量,相互独立、没有关联。普通成员与对象绑定,随对象的建立而建立,随对象的消亡而释放,类似于局部变量或malloc堆内存。

  • 成员函数:隐藏着一个this指针,接受调用者的地址,用于区分调用者

静态成员特点:

静态成员变量:

1、存储在data/bss段,一个类中的所有静态成员变量只有唯一一份,被所有类对象共享

2、一旦成员变量被声明为静态成员变量,通过sizeof计算类字节时,就不统计该成员的字节数,即静态成员变量在对象中不占用存储空间,只是一个申明,他的内存空间与全局变量在一个区域。

class Test
    {
        int a;
    };
    cout << sizeof(Test) << endl;    //4 
class Test
    {
       static int a;
    };
    cout << sizeof(Test) << endl;    //1 

3、静态成员变量必须在类内加static声明在类外单独定义、初始化(生命周期被延长),定义时无需加static,不能在构造函数的初始化列表中创建,也不能用初始化列表来初始化,初始化时如果不赋初值,默认等于0。

4、静态成员变量的生命周期不再依赖于某个类对象,伴随整个程序的生命周期

5、因为静态成员变量的存在不依赖任何类对象(属于类但是不属于对象),所以可以不实例化类对象就直接访问

    类名::静态成员变量    //    无需实例化对象
    
    对象名.成员变量/静态成员变量    //public
    对象名->成员变量/静态成员变量

静态成员函数:

1、没有隐藏的this指针,所以在静态成员函数中,不能直接访问普通成员变量、普通成员函数,但是可以间接访问(手动传递对象的地址),毕竟静态成员函数还是属于类的

2、可以直接访问静态成员变量和静态成员函数

3、想要静态修饰成员函数,只能在类中添加static,不能在外部实体函数添加,因为外部实体函数前添加static与文件内作用域功能的static冲突。

4、调用方式:

    对象名.成员函数()/静态成员函数()
    对象名->成员函数()/静态成员函数()
    
    类名 ::静态成员函数()    //无需实例化

实例:

#include <iostream>
using namespace std;

class Test
{
	static int a;	
	int b;
public:
	static void show(Test* t)
	{
		cout << a << endl;	
		cout << t->b << endl;
	}
	static void show_a(void)
	{
		cout << a << endl;	
	}
};

int Test::a = 88;

int main(int argc,const char* argv[])
{
	cout << sizeof(Test) << endl;
	Test::show_a();
	/*
	cout << Test::a << endl;
	Test::a = 99;
	cout << Test::a << endl;

	Test t1,t2;
	t1.show(&t1);
	t1.a = 1234;
	t1.show(&t1);
	t2.show(&t2);

	cout << &t1.a << " " << &t2.a << endl;
	*/
}

静态成员的作用:

1、静态成员相当于多了一层类作用域的全局变量、全局函数

2、静态成员变量适合存储所有类对象的公共属性,从而节约资源(如税率、利率等)

3、静态成员函数可以当作访问私有的静态成员变量的公开接口,一方面不破坏类的封装性,另一方面可以无需实例化对象也能调用类的静态成员,让类本身具有管理自己成员的能力

标签:变量,静态,成员,C++,对象,static,函数
From: https://www.cnblogs.com/ljf-0804/p/17655420.html

相关文章

  • C++11 四种强制类型转换的区别
    static_cast:指针强转,如果某个基类有多个子类,基类的指针实际是指向A类的对象,但使用强转为B类对象,运行时会报错,静态强转没做检测dynamic_cast:只能用于虚函数类,子类与父类指针互转,会检测,转换失败为返回空,不会崩const_cast:用于转换常量,修改常量,先用一个常......
  • C++拷贝构造、赋值函数
    拷贝构造拷贝构造就是一种特殊版本的构造函数,格式:类名(const类名&that){    //执行给每个成员变量进行赋值  }什么时候会调用拷贝构造:当使用旧对象(已new的)给新对象(新new的)初始化时,会自动调用拷贝构造    Testt1;//调用无参构造Testt2=t1......
  • C++this指针、常函数
    this指针this指针的类型:类类型*const。不能被修改和赋值。只能在成员函数的内部使用。全局函数、静态函数都不能使用this.this指针本质上其实是一个成员函数的形参(栈),是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。this指针是成......
  • C++静态成员和单例模式
    一、静态成员Ⅰ.什么是静态成员:被static修饰的成员变量和成员函数就叫静态成员Ⅱ.普通成员的特点:成员变量:每个类对象中都有一份属于自己的成员变量,相互之间没有关联、独立的成员函数:隐藏着一个this指针,接收调用者的地址用于区分调用者Ⅲ.静态成员的特点:静态成员变......
  • C++对象的创建和销毁过程分析
    对象的创建和销毁过程分析1、对象的创建过程①给对象划分内存空间(栈、堆)②执行初始化列表根据继承表的顺序调用父类的无参构造或有参构造通过:父类(val)调用父类的有参构造根据成员变量的定义顺序调用类类型成员的无参构造或有参构造通过:类类型成员名(val)调用类类型成员......
  • C++面向对象、类和对象、访问控制限定符
    面向对象和面向过程面向过程:关注如何解决问题,以及解决问题的步骤面向对象:关注的解决问题的"人"即"对象",以及实现能解决问题的"对象"注意:面向对象的细节的本质上还是面向过程,因此面向对象不是解决问题的捷径,而是以更高的维度去思考问题面向对象的四个特性:抽象:先找出(想象)......
  • Windows中通过C++自动添加防火墙例外规则
    在C++程序中无法直接控制防火墙警报窗口的显示,因为这是由操作系统和防火墙软件控制的。防火墙警报窗口是为了提醒用户程序正在尝试与外部网络进行通信,以确保用户意识到可能的网络活动。然而,可以通过编写C++程序在用户的系统上自动添加防火墙例外规则,从而避免防火墙警报窗口的显示......
  • 基于静态编译构建微服务应用
    作者:饶子昊(铖朴)Java的局限性传统的一个Java应用从代码编写到启动运行大致可以分为如下步骤:首先,编写.java源代码程序。然后,借助javac工具将.java文件翻译为.class的字节码,字节码是Java中非常重要的内容之一,正是因为它的出现,Java才实现对底层环境的屏蔽,达到Writ......
  • C++构造函数、析构函数、初始化列表
    构造函数构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化任务:一般负责对类对象进行初始化、资源分配class类名{int*p;public:类名(参数){p=newint;}}......
  • C++内联函数、引用、强制类型转换
    三、内联函数inline1、普通函数普通函数会被编译成二进制指令存储在代码段中,调用语句会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回2、什么是内联函数内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内......