• 服务器开发不常见操作


    #include 
    
    class Fiber {
    public:
        typedef std::shared_ptr<Fiber> ptr;
    
        static Fiber::ptr GetThis(){
            return Fiber::ptr(new Fiber);
    }
    
        // 其他成员函数和成员变量
    
    private:
        Fiber();
    
        // 其他私有成员函数和成员变量
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在提供的代码示例中,GetThis是一个静态成员函数,它返回一个指向Fiber类新实例的智能指针。这里使用了std::shared_ptr智能指针来管理Fiber对象的生命周期。这段代码是有效的C++语法,因为new Fiber是合法的,即使Fiber的构造函数是私有的。在C++中,类的成员函数(包括静态成员函数)可以访问该类的私有成员,包括私有构造函数。
    静态成员函数GetThis通过new操作符动态创建了一个Fiber实例,并将其包装在一个智能指针中返回。由于这个操作是在类的静态成员函数内部进行的,它可以访问私有构造函数来创建实例。
    因此,尽管通常静态成员函数无法直接调用非静态成员,但它们仍然可以访问类的所有私有和保护成员,包括私有构造函数,所以代码是可行的。

    在C++中,访问控制(如private, protected, public)决定了类成员(函数和变量)如何被访问。不同于静态成员和非静态成员之间的区别,访问控制和是否可以修改对象的状态是两个不同的概念:
    访问:
    静态成员函数可以访问类的所有静态成员变量和其他静态成员函数,而不需要类的实例。
    静态成员函数也可以访问类的私有构造函数,如之前示例中所示。
    静态成员函数不能直接访问非静态成员变量和非静态成员函数,因为它们需要一个类的实例。
    修改:
    静态成员函数确实有能力修改类的静态成员变量,因为这些变量属于类自己,而不是任何单个的对象实例。
    如果静态成员函数通过某种方式(如创建对象实例)可以访问非静态成员变量,它也可以修改这些非静态成员变量的值。但是,通常这不是标准做法。
    可以这样理解:访问权限决定了是否可以读写某个成员(不管是变量还是函数),而成员是否为静态则决定了调用(读写操作)时是否需要类的实例。在您提供的代码中,GetThis静态函数创建了Fiber类的实例,并且对该实例持有权,如果Fiber类中有公有的非静态成员变量或成员函数,通过这个实例,GetThis就能对它们进行修改操作。因为构造出来的Fiber对象是一个完整的Fiber实例,拥有其所有的非静态成员。

  • 相关阅读:
    《C++ 并发编程实战 第二版》:条件变量唤醒丢失与虚假唤醒
    mysql索引条件下推 、 count(*)、count(1)、IN 、exists等
    Shapiro-Francia正态检验
    熊市中市场状况低迷,COSOSWAP逐步实现协议价值的捕获
    二、DMSP/OLS夜光数据校正之饱和校正
    《Playing repeated games with Large Language Models》全文翻译
    爆赞!GitHub首本前端开发实战Vue.js3,标星果然百万名不虚传
    运维面临挑战?智能运维管理系统来帮您
    朋友圈点赞功能的测试用例(待更新完)
    ubuntu18.04环境搭建
  • 原文地址:https://blog.csdn.net/Tmicen/article/details/136459931