问题收集

108 阅读4分钟

私有和公有的static有什么区别?

static 属性与非 static 属性的主要区别在于它们的作用域和生命周期。而私有(private)和公有(public)是访问修饰符,它们定义了类成员的访问级别。

私有(private)属性

  • 只能被类内部的成员函数访问。
  • 不能被类的实例直接访问,也不能被派生类或外部代码访问。

公有(public)属性

  • 可以被类的实例直接访问。
  • 也可以被派生类或外部代码访问,除非有更严格的访问控制。

私有 static 属性

  • 只能通过类名作用域解析操作符(在 C++ 中是 ::)访问。
  • 属于类本身,而不是类的某个特定实例。
  • 所有实例共享同一个 static 属性。
  • 生命周期从创建到程序结束。

公有 static 属性

  • 可以通过类名直接访问,也可以通过实例访问(如果类提供了访问器)。
  • 同样属于类本身,所有实例共享。
  • 生命周期也是从创建到程序结束。

区别

  1. 访问控制:私有 static 属性不能被外部代码直接访问,而公有 static 属性可以。
  2. 使用场景:私有 static 属性通常用作内部状态的存储,比如计数器,而公有 static 属性可能用作全局配置或状态的存储。

单例里面的私有静态指针变量

static Singleton* instance; // 私有静态指针变量
1.  **私有性**:这个指针变量只能在类的内部被访问和修改,即它不能被类的外部代码直接访问,也不能被派生类直接访问。
1.  **静态性**:这个指针变量是静态的,意味着它不属于类的任何特定实例,而是属于类本身。所有类的实例共享同一个静态指针变量。
1.  **指针**:它是一个指针,通常用于指向动态分配的内存或其他资源。指针变量可以被初始化为指向特定的内存地址,或者设置为 `nullptr`

函数形参什么时候用指针什么时候用引用呢

在C++中,函数参数可以是指针或引用。选择使用指针还是引用取决于特定的情况和需求。以下是一些指导原则:

使用引用的情况:

  1. 避免复制:如果参数是大型对象,使用引用可以避免复制整个对象,从而节省内存和提高效率。

  2. 保持一致性:如果一个类的方法通常接受引用参数,那么在函数中也使用引用参数可以保持一致性。

  3. 简化语法:引用语法比指针语法更简洁,不需要使用*操作符来访问对象的成员。

  4. 避免空值:引用不能是空值(nullptr),这可以避免一些与空指针相关的错误。

  5. 返回对象:如果函数需要返回对象的一个副本,并且你希望调用者能够以值的方式接收它,那么使用引用作为参数类型可以方便地返回对象。

  6. 操作符重载:如果类重载了操作符,使用引用参数可以确保这些操作符能够正常工作。

使用指针的情况:

  1. 可选参数:如果函数需要处理空值(例如,nullptr表示没有值),那么使用指针是合适的。

  2. 动态分配:如果函数内部需要动态分配内存,那么使用指针来接收这个内存的地址是有意义的。

  3. 修改对象:如果函数需要修改传入的对象,并且这些修改需要反映到原始对象上,使用指针是必要的。

  4. 函数指针:在处理函数指针或回调函数时,通常使用指针。

  5. 数组:处理数组时,通常使用指针,因为数组在传递给函数时本身就是通过指针来操作的。

  6. void指针:在需要类型安全但又要处理多种类型的通用代码中,可能会使用void*指针。

其他考虑:

  • const引用:如果函数不需要修改参数,并且想要避免复制,可以使用const引用。这样可以保证函数内不会修改参数,并且避免了复制。

  • 右值引用:C++11引入了右值引用,允许函数接受临时对象,这在移动语义和完美转发中非常有用。

  • std::reference_wrapper:在需要包装引用以通过它们时,可以使用std::reference_wrapper

  • std::shared_ptr和std::unique_ptr:在需要管理对象生命周期的情况下,可以使用智能指针。

选择使用指针还是引用,需要根据函数的具体需求、性能考虑、代码风格和一致性等因素综合考虑。