[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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律