【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间
void f1() { const int x=1; cout<<x<<endl; } void f2() { static int y=2; cout<<y<<endl; y++; } int main() { f1();//1 f1();//1 const定义的常量在超出其作用域之后其空间会被释放 f2();//2 f2();//3 static定义的静态常量在函数执行后不会释放其存储空间 }
2)static静态成员变量不能在类的内部初始化,在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,比如:double Account::Rate = 2.25,static关键字只能用于类定义体内部的声明中,并且在外部定义时不能标识为static
class A { private: static int x;//static成员变量只能在内部声明,定义需要放在类的外部 public: void f() { cout<<x<<endl; } }; //error 外部定义时不能标识为static //static int A::x=10; int A::x=10;//在类的外部定义该static成员变量 int main() { A a; a.f();//10 }
3)static表示的是静态的,类的静态成员函数,静态成员变量是和类相关的,而不是和类的具体对象相关的,即使没有具体对象,也能调用类的静态成员函数和静态成员变量。一般类的静态成员函数就相当于一个全局函数,只不过它的作用域限定于包含它的文件中
class A { public: static int x; static void test() { cout<<"test"<<endl; } void f() { cout<<x<<endl; } }; int A::x=10; int main() { //即使没有具体对象,也能调用类的静态成员函数和静态成员变量 cout<<A::x<<endl;//10 A::test();//test A a1; a1.f();//10 A a2; a2.f();//10 类的静态成员变量和对象无关,只和类有关 }
4)const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数
const成员变量只在某个对象生存期内是常量,而对于整个类而言却可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同,所以不能在类的声明中初始化const数据成员,因为类的对象没有被创建时,编译器不知道const数据成员的值是什么
class A { private: //const int x=1; //const int y=2; //错误的做法:在这里初始化虽然语义可以通过,但是还是会被构造函数中的值覆盖 const int x; const int y; public: void f() { cout<<x<<" "<<y<<endl; } A(int a,int b):x(a),y(b)//通过构造函数初始化列表来初始化const成员变量,而且必须要有构造函数 { }; }; int main() { A a1(10,20); a1.f();//10 20 A a2(11,21); a2.f();//11 21 }
6)const数据成员的初始化只能在类的构造函数的初始化列表中进行,要想建立在整个类中都恒定的常量,应该用类中的枚举常量实现,或者static const
class A { private: const int x; const int y; public: void f() { cout<<x<<" "<<y<<endl; } enum{x1=100,y1=200}; A(int a,int b):x(x1),y(y1)//通过枚举常量进行恒定初始化,传入的a和b根本没有用到 { }; }; int main() { A a1(10,20); a1.f();//100 200 A a2(11,21); a2.f();//100 200 }
class A { private: const int x; const int y; public: void f() { cout<<x<<" "<<y<<endl; } static int x2,y2; A(int a,int b):x(x2),y(y2)//通过static成员变量进行恒定初始化,传入的a和b也没有起到作用 { }; }; int A::x2=300; int A::y2=400; int main() { A a1(10,20); a1.f();//300 400 A a2(11,21); a2.f();//300 400 }
7)const成员函数的主要目的是防止成员函数修改对象内容,即const成员函数不能修改成员变量的值,但是可以访问成员变量
class A { private: int x=2; public: int p() const { //x=3;//error const成员函数不能修改成员变量 return x;//但是可以访问成员变量 } void f() { cout<<x<<endl; } }; int main() { A a1; cout<<a1.p()<<endl;//2 a1.f();//2 }
8)static成员函数的主要目的是作为类作用域的全局函数,不能访问类的非静态数据成员,因为类的静态成员函数没有this指针,这导致:1.不能直接存取类的非静态成员变量,调用非静态成员函数,2.不能被声明为虚函数(没有this指针,实现不了多态,定义为虚函数没有意义)
class A { public: int x=2; void f() { cout<<x<<endl; } static int p() { int k=3; // k=x; //error 不能直接存取非静态成员变量 // f(); //error 不能直接调用非静态成员函数 return k; } }; int main() { A a1; cout<<a1.p()<<endl;//3 a1.f();//2 }
9)类的const static或static const成员变量必须在哪里初始化?
必须在类的外部进行定义初始化
class A { private: static const int x; const static int y;//哪个关键字在前无所谓,x和y的含义是相同的 public: void f() { cout<<x<<" "<<y<<endl; } }; const int A::x=300;//不能加static关键字,但是必须加const关键字 const int A::y=400; int main() { A a1; a1.f();//300 400 A a2; a2.f();//300 400 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2018-09-29 史上最详细的codeblocks安装教程!!!
2018-09-29 计算机网络(谢希仁 第七版) 数据链路层 个人笔记