[c++] Define static const members in class

C++ 类的静态成员


趣味Quiz

this指针

静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。

普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。

类似于Python的Class和Object之间的关系。

  

静态变量好于全局变量

因为静态变量至少有类的范围保护。

Ref: C++ static、const和static const类型成员变量声明以及初始化

 

  • 静态函数内部的变量是静态的么?

方法里声明的变量都是临时变量,跟静态不静态没有关系...静态方法也跟静态对象没有关系...

 

  • 类中的静态变量

复制代码
class Test{
public:
    Test():a(0){}
    enum {size1=100,size2=200};
private:
    const int a;//只能在构造函数初始化列表中初始化
    static int b;//在类的实现文件中定义并初始化
    const static int c;//与 static const int c;相同。
};
复制代码

定义和声明最好分别放在.h和.cpp中。

int Test::b=0;//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。
const int Test::c=0;//注意:给静态成员变量赋值时,不需要加static修饰符,但要加connt。

  

  • 派生类与基类共用一个静态数据成员

如果不是静态的,那么会涉及到成员变量的覆盖:子类覆盖的仅仅是继承来的那个成员变量,而并不改变原来父类中的变量;

复制代码
#include <iostream>
#include <string>
using namespace std; class A { public: int m; A() { m=1; printf("A.m=%d\n",this->m); } void print() { printf("%d\n",this->m); } }; class B:public A { public: int m; B() { m=2; printf("B.m=%d\n",this->m);} }; int _tmain(int argc, _TCHAR* argv[]) { B b; b.print();
printf(
"%d\n",b.m); return 0; }
///====================================输出 A.m=1 B.m=2 1 2
复制代码

 

 

单例模式

Ref: 设计模式之单例模式(c++版)

线程不安全版本

复制代码
class Singleton{
public:
    static Singleton* getInstance(){
        // 先检查对象是否存在
        if (p_instance == nullptr) {
            p_instance = new Singleton();
        }
        return p_instance;
    }
private:
    Singleton(); //私有构造函数,不允许使用者自己生成对象
    Singleton(const Singleton& other);
    static Singleton* p_instance; //静态成员变量 
};

Singleton* Singleton::p_instance=nullptr; //静态成员需要先初始化
复制代码

 

c++ 11版本简洁方法

其实c++ 11中已经提供了std::call_once方法来保证函数在多线程环境中只被调用一次,同样,他也需要一个once_flag的参数。用法和pthread_once类似,并且支持跨平台。

实际上,还有一种最为简单的方案!

在C++memory model中对static local variable,说道:The initialization of such a variable is defined to occur the first time control passes through its declaration; for multiple threads calling the function, this means there’s the potential for a race condition to define first.

局部静态变量不仅只会初始化一次,而且还是线程安全的。

复制代码
class Singleton{
public: // 注意返回的是引用。 static Singleton& getInstance(){ static Singleton m_instance; //局部静态变量 return m_instance; }
private: Singleton(); //私有构造函数,不允许使用者自己生成对象 Singleton(const Singleton& other); };
复制代码

 

 

 

 

C++ 常对象和常成员函数


常对象

不能修改的对象,“只读”。使用const声明,声明时必须初始化。

格式: const  类名  对象名 (初始化列表)
             类名  const  对象名 (初始化列表)

const Point p(100,200); 

 

 

常成员函数

只能访问数据成员而不能设置或修改数据成员。

const成员函数只能调用const成员函数(C++不允许const成员函数调用非const成员函数,因为非const函数可能会设置或者修改数据成员的值)

const对象只能调用const成员函数,也是同理。此时,对象相当于只开放了“read"属性。

 

但const成员函数的调用者可以是const的也可以是非const的。

PS: 声明和定义const成员函数都必须加const,否则编译器会认为这是重载函数。

 

 

常数据成员

只读。只能通过构造函数设置,而且必须在初始化列表中进行初始化

 

End.

posted @   郝壹贰叁  阅读(280)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示