C++类的静态成员

C++类的静态成员:

基本概念:

静态成员函数,和静态成员,属于类,存在于任何对象之外
对象中不包含任何与静态数据成员相关的数据,随类的产生而产生,不属于对象。(用sizeof求一个对象的大小,一定是不包含静态成员的)。

原理:this指针

当调用普通成员函数时,隐藏传入一个this指针,指向当前对象
调用静态成员函数,并不会传入this指针,所以函数不知道当前调用的数据成员究竟是哪个对象的数据成员(无法提供一个真正的对象)所以在静态成员函数中,不可以调用非静态的成员或成员函数

声明静态成员:

在成员名声明之前上关键字static使得其与类关联在一起,和其他成员一样,区分public,private。静态成员可以是常量,引用,类类型。

定义静态成员:

在类的外部定义静态成员时,不能重复static关键字,static只出现在类内部的声明语句中。
静态成员不属于对象,所以不是在创建对象时被定义的,所以肯定不是构造函数中初始化的。
一般不能在类的内部初始化静态成员,必须在类外部定义和初始化每个静态成员,一个静态数据成员只能被定义一次。 类似全局变量。生命周期属于整个程序

类内初始化:

通常情况下,不在类内初始化,然而 如果用const int类型初始化静态成员,要求静态成员必须是字面值常量类型,constexpr ,初始值必须是常量表达式

静态成员能用于某些场景,而普通成员不能:

1.静态数据成员的类型可以就是它所属的类类型。而非静态数据成员则会收到限制,只能声明成它所属类的指针或引用;

class A{
    static A mem1; //正确,静态成员可以是不完全类型
    A        mem2; //错误,数据成员必须是完全类型
};

2.静态成员可以作为默认实参,非静态成员不能,原理this指针,无法真正提供一个对象以便从中获取成员的值。关于默认实参,下面讨论

使用静态成员

使用方式:
使用作用域运算符直接访问静态成员
使用对象,引用,指针访问静态成员

在非静态的成员函数中,可以调用静态的成员或成员函数,因为可以将静态的成员函数或者静态成员当做全局的函数和数据。

注意事项:

1.静态数据成员必须单独初始化,没有对象,也会产生静态数据成员。
2.静态成员不能调用非静态成员函数和非静态数据成员
3.静态数据成员只有一份,且不依赖对象而存在

默认实参:

既可以在函数声明中也可以在函数定义中指定默认实参,但是在一个文件中,只能为一个形参指定默认实参一次;如果在函数定义的形参表中提供默认实参,那么只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的。

一般情况下,在声明中给出默认实参,在定义中不再给出。
如果默认实参写在定义中,因为只有在该函数定义的源文件中调用该函数时,默认实参才是有效的。
默认实参是一种虽然并不普遍、但在多数情况下仍然适用的实参值。调用函数时,可以省略有默认值的实参。编译器会为我们省略的实参提供默认值。 默认实参是通过给形参表中的形参提供明确的初始值来指定的。程序员可为一个或 多个形参定义默认值。但是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参。(有默认实参的,同一往右靠)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值