C++ static关键字用于类间指针传递

C++ static关键字有很多作用,包括隐藏,保持变量内容的持久,初始化值为0等等,大部分作用可以在博客https://blog.csdn.net/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文件里定义的属于类外还是类内,详情在博客

https://blog.csdn.net/xdc_zy/article/details/78319381

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值