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.静态数据成员只有一份,且不依赖对象而存在
默认实参:
既可以在函数声明中也可以在函数定义中指定默认实参,但是在一个文件中,只能为一个形参指定默认实参一次;如果在函数定义的形参表中提供默认实参,那么只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的。
一般情况下,在声明中给出默认实参,在定义中不再给出。
如果默认实参写在定义中,因为只有在该函数定义的源文件中调用该函数时,默认实参才是有效的。
默认实参是一种虽然并不普遍、但在多数情况下仍然适用的实参值。调用函数时,可以省略有默认值的实参。编译器会为我们省略的实参提供默认值。 默认实参是通过给形参表中的形参提供明确的初始值来指定的。程序员可为一个或 多个形参定义默认值。但是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参。(有默认实参的,同一往右靠)