C++ static关键字有很多作用,包括隐藏,保持变量内容的持久,初始化值为0等等,大部分作用可以在博客https://blog.youkuaiyun.com/wangbeibei23/article/details/89343705中看到;
在大型软件项目中,类之间指针传递是一个大的问题,如在A类新建一个类指针,假设设为subA *a=new subA,这个a指针需要在B类中使用,那么如何传递进去?
当然,可以通过B类的构造函数将A指针传递进去,例如:
class subA
{
public:
void func();
};
class A
{
public:
A()
{
a=new subA;
}
subA *a;
};
class B
{
public:
B(A *aptr)
{
aptr->a->func();
}
};
但是,如果B的类构造函数已经有了多个类指针传递,那么一味增加可读性不好,特别的是如果B类在创建的时候A类并没有指针传递进来,即如果B类在C类中创建,而C类并没有传递A指针,难道C类构造函数也开口A指针?当然也无不可,但是如此 ,一直溯流而上,难不了遇见一个类构造函数有多个指针传递的现象;
static 关键字提供了一个好的途径,当然,它也有局限性:即subA 在类A中不调用或者很少调用A类中的其他成员变量,因为静态成员函数没有this指针,只能调用静态的成员变量,但由于static关键字的种种特性,贸然改变其他成员属性,可能会造成其他的后果。
下面假设它并不受局限性影响,我们看它如何使用:
class A
{
public:
static subA *a;
};
subA* A::a=new subA; //必须在类外定义和初始化
class B
{
public:
B()
{
A::a->func();
}
};
如果C、D类也需要类指针a,如果B类已经定义了,C、D只需要包含Class A声明的头文件,就可以直接使用A::a->func。注意,subA* A::a不可重复定义,否则编译器会报错:(.bss+0x0):-1: error: multiple definition of `A::a'
另外,在写博客的过程中,发现自己对一些基本概念混淆了很多,所以也一并写下来,一为增长记忆,二也为和我一样迷糊的人打个提点:
1.static成员函数只能在类外定义和初始化:
class A
{
public:
void func(int i)
{
b=i; //1处,这里算??
}
static int b;
};
int A::b;
int main()
{
A *a=new A;
a->func(4);
std::cout<<a->b<<std::endl;
std::cout<<A::b<<std::endl;
}
类外定义很容易理解,如果没有int A::b类外定义,编译器会报错,只是1处算类内初始化么?这里混淆了初始化和赋值的概念:初始化的意思是创建变量时赋予其一个初始值,但是初始化不是赋值,赋值的意思是把对象的当前值擦除,而以一个新值来替代。因此1处是赋值,如果没有int A::b=1(初始化1),那么static成员默认初始化值为0;
2. 类内定义和类外定义,这里混淆了如果在.h里面声明了class A, 那么在.cpp文件里定义的属于类外还是类内,详情在博客