• 服务器开发不常见操作


    #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实例,拥有其所有的非静态成员。

  • 相关阅读:
    freesql自定义sql和参数查询
    Vmware Workstation安装说明
    PHP 接入 Apple 登录对 identityToken 验证
    PHP请求API接口案例采集电商平台数据获取淘宝/天猫优惠券查询示例
    数据预处理与模型评估【机器学习、人工智能、实际事例】
    NLP语言学基础
    Leetcode147. 对链表进行插入排序
    1.初识MySQL
    MySQL数据脱敏(Data masking plugin functions)
    力扣(LeetCode)272. 最接近的二叉搜索树值 II(2022.09.29)
  • 原文地址:https://blog.csdn.net/Tmicen/article/details/136459931