C++中类的静态变量在哪初始化
static修饰的成员变量存在哪?
----------------------------------------------------
static成员变量:不能在头文件中初始化
//3.static成员必须在类外初始化;并且,不能在头文件中初始化;否则,在链接时可能会出现重定义的问题。
==============================
C++成员初始化
class Wzz
{
private:
int a=0 ;
const int b;
static int c;
int& f;
static const int d = 0;
const static int e = 0;
};
//1.一般常量 a,
a.可以在声明时给缺省值,这样即使在构造函数中没有初始化a,a也会被初始化成缺省值
b.可以在构造函数内部给值,也可以在初始化列表中给定数值初始化。
Wzz(int _a)
:a(_a)
{
a = _a;
}
//2.const修饰的和引用必须在初始化列表中初始化
//3.static成员必须在类外初始化,并且不能在头文件中初始化,否则在链接时可能会出现重定义的问题
//4.staic const可以在类内声明时就定义初始化,也可以在类外初始化
//5.自定义类型对象。该对象没有默认构造函数的话要在初始化列表里初始化,有的话不必处理
C++中类的静态变量在哪初始化
静态数据成员的使用方法和注意事项如下:
1、静态数据成员在定义或说明时前面加关键字static。
2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
<数据类型><类名>::<静态数据成员名>=<值>
这表明:
(1) 初始化在类体外进行,而且前面不能加static。
(2) 初始化时,不加该成员的访问权限控制符private,public等。
(3) 初始化时,使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
- 注 1. 意味着:与对象无关,一个类可以有 N个对象。
- 注 2. 本质上,就相当于是“全局变量”,只不过增加了一个作用域限定符;也就是相当于增加了一个命名空间;这比单纯的全局变量,更能防止命名冲突。
3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
4、引用静态数据成员时,采用如下格式:
<类名>::<静态成员名>
静态变量的初始化
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。
exp:
class aclass{
public:
static int a;
};
int aclass::a=0; //初始化:类外初始化。
void main()
{
int amain=0;
amain=aclass::a; //使用,无需定义相关类的变量而直接使用之。
}
static修饰的成员变量先于对象存在,故static修饰的成员变量必须在类外初始化。
静态常量的初始化
对于 静态常量整型 可以在类中初始化,另外对于常量则必须在构造函数成员初始式列表里初始化。
#include <iostream>
using namespace std;
class Person
{
public:
const int a ;
static const int b = 2 ; // 对 静态-常量整型 初始化
Person(int aa):a(aa) // 这里必须对常量a初始化,也只能这样初始化。
{}
};
int main()
{
cout << Person::b << endl;
Person p(9);
cout << p.a << endl ;
return 0;
}
C++ static静态成员变量详解
注意:
static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问
具体来说,static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存,不了解的读者请阅读《C语言内存精讲》专题。
几点说明
一个类中可以有一个或多个静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。
static 成员变量和普通 static 变量一样,都在内存分区中的全局数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
静态成员变量必须初始化,而且只能在类体外进行。例如:
int Student::m_total = 10;
初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。
静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。
————————————————
版权声明:本文为CSDN博主「luoganttcc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoganttcc/article/details/121121478
static修饰的成员变量存在哪?
1.static segment(栈):申明一个局部变量放在栈中。
2.heap segment(堆):new一个对象时,对象放在堆中。
3.data segment(数据区):static的变量或者字符串变量放入数据区。
4.code segment(代码区):类中的方法放入代码区。
————————————————
版权声明:本文为CSDN博主「大可爱吃瓜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38331643/article/details/83963523
static修饰的成员方法, 变量及其初始化
1.static修饰的成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
类变量存储在方法区当中
生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁
2.static修饰的成员方法
static修饰的成员方法,成为静态方法,其也是不属于某个具体的对象,是所有对象共享的.
【静态成员方法特性】
不属于某个具体的对象,是类的属性,是所有对象共享的,不存在对象的空间中
既可以通过对象访问,也可以通过类名访问,但是一般更推荐使用类名访问,体现其实类的属性
3.成员方法与静态成员变量一样储存在方法区中
4.生命周期伴随类的一生
package demo3;
public class Demo3 {
static String name;
int age;
public static void func(){
System.out.println("这是一个静态的成员方法");
}
}
class Demo99{
public static void main(String[] args) {
Demo3 demo3=new Demo3();
Demo3.func();//使用类名来调用静态的成员方法
demo3.func();//使用对象的引用来调用静态的成员方法
demo3.name="yaoyao";//使用对象的引用对静态的成员变量进行赋值
Demo3.name="哈哈";//使用类名对静态成员变量进行赋值
System.out.println(demo3.name);//使用对象的引用来调用静态
//成员变量
System.out.println(Demo3.name);//使用类名来调用静态成员变量
}
}
3. 如何对静态成员进行初始化
方法一:
在创建时进行初始化
在这里插入图片描述
方法二:
后续初始化
在这里插入图片描述
方法三:
用set方法进行初始化
在这里插入图片描述
方法四:
使用静态的代码块进行初始化
在这里插入图片描述
但是我发现使用非静态的代码块好像也可以对静态成员变量进行初始化
在这里插入图片描述
运行结果如图:(结果就是非静态的代码块覆盖掉了静态代码块所赋的值)
在这里插入图片描述
方法五:
在构造方法中初始化静态成员变量(仅仅是尝试)
在这里插入图片描述
运行结果:(目前根据运行结果来看是可以的)
在这里插入图片描述
应该还有很多方法来初始化我们的静态成员变量,我们可以不断尝试下…
————————————————
版权声明:本文为CSDN博主「c_topy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_55204216/article/details/128335685