static 类型初始化

在初始化时,先初始化static类型变量,再初始化普通变量,再初始化构造函数。
如下程序:
class A{
A(int i){
System.out.println("A "+i);
}
void f(int i){
System.out.println("f1 "+i);
}
}

class B{
static A a1=new A(1);
B(){
System.out.println(" B ");
a2.f(1);
}
void f2(int i){
System.out.println(" f2 "+i);
}
static A a2=new A(2);
}

class C{
A a3=new A(3);
static A a4=new A(4);
C(){
System.out.println(" C ") ;
a4.f(2);
}
void f3(int i){
System.out.println(" f3 "+i);
}
static A a5=new A(5);
}
public class TestStaticInitial {
public static void main(String args[]){
System.out.println("Now begin to test!");
new C();
System.out.println("Now begin to test the second time!");
new C();
bb.f2(1);
cc.f3(1);
}
static B bb=new B();
static C cc=new C();
}
执行顺序:
在主程序中,先初始化static 变量bb,cc.
再打印Now begin to test!;
执行new C();
再打印Now begin to test the second time
执行new C();

初始化变量bb的过程:
先初始化static 变量a1,a2
再执行B();

[color=red]注意static变量只执行初始化一次[/color]
<think>好的,我现在需要解释C++中静态成员的初始化。首先,我得回忆一下静态成员的基本概念。静态成员属于类本身,而不是类的实例,所以所有实例共享这个成员。那初始化的话,应该和普通成员变量不同,对吧? 接下来,要区分静态成员的类型,比如是普通数据类型还是常量整型或者枚举类型。记得常量静态整型可以在类内直接初始化,而其他类型的静态成员需要在类外定义和初始化。比如,static const int可以在类里直接赋值,但static double就需要在类外进行。 然后,我需要考虑静态成员的初始化位置。普通的数据类型必须在类外进行,通常在源文件中使用作用域解析运算符来指定所属的类。比如,int Class::var = 0;。这里要注意,即使没有显式初始化,编译器也会给静态成员一个默认值,比如0,但最好还是显式初始化。 对于静态常量整型,像static const int N = 10;,确实可以在类内部直接初始化,而不需要在类外重复定义。不过,如果这个变量被ODR-used(比如取地址),就需要在类外再定义一次,但这种情况可能不常见。 另外,静态成员函数的问题,它们只能访问静态成员变量,不能访问非静态成员。这点需要提到,但可能用户的问题更多在变量初始化上。 可能需要注意的地方是,类模板中的静态成员初始化方式是否不同。比如,模板的静态成员初始化需要在头文件中进行,或者在类外定义时也要包含模板参数。不过用户的问题可能不涉及模板,所以暂时可以省略这部分,除非必要。 用户可能遇到的常见错误,比如忘记在类外定义静态成员导致链接错误,或者在类内初始化非整型静态常量。这时候需要强调正确的初始化位置和语法。 总结一下,回答的结构应该是先介绍静态成员的概念,然后分类讨论不同数据类型初始化方式,举例说明,最后指出常见错误和注意事项。需要确保使用正确的中文术语,比如“静态成员变量”和“静态成员函数”,并用代码示例来辅助说明。</think>在C++中,`static`成员(静态成员)属于类本身而非类的实例,其初始化有特殊规则。以下是分步说明: --- ### 一、静态成员的特点 1. **共享性**:所有类实例共享同一份静态成员。 2. **独立于对象**:即使没有创建对象,静态成员仍存在。 3. **访问方式**:可通过类名直接访问(`类名::静态成员`)或通过对象访问。 --- ### 二、静态成员的初始化规则 #### 1. **普通静态成员变量** - **必须类内声明,类外初始化** 语法:`数据类型 类名::变量名 = 初始值;` ```cpp class MyClass { public: static int count; // 类内声明 }; int MyClass::count = 0; // 类外初始化(必须写在.cpp文件中) ``` #### 2. **静态常量整型(const integral)** - **允许类内直接初始化** 包括`int`, `char`, `bool`等整型类型: ```cpp class MyClass { public: static const int MAX = 100; // 类内直接初始化 }; ``` #### 3. **静态常量非整型(如double、自定义类)** - **仍需类外初始化** ```cpp class MyClass { public: static const double PI; // 类内声明 }; const double MyClass::PI = 3.1415; // 类外初始化 ``` #### 4. **静态成员函数** - **无需初始化,直接定义** 静态函数只能访问静态成员: ```cpp class MyClass { public: static void printCount() { std::cout << "Count: " << count; // 只能访问静态成员count } }; ``` --- ### 三、注意事项 1. **避免重复初始化** 类外初始化只需一次,通常在源文件(`.cpp`)中完成。 2. **访问权限** 静态成员仍需遵守访问控制(`public`/`private`)。 3. **模板类中的静态成员** 需在头文件中类外初始化,且每次实例化模板时都会生成独立的静态成员。 --- ### 四、示例代码 ```cpp #include <iostream> class Counter { public: static int count; // 声明普通静态变量 static const int MAX = 10; // 类内初始化静态常量整型 Counter() { count++; } static void show() { std::cout << "Count: " << count << ", MAX: " << MAX << std::endl; } }; int Counter::count = 0; // 类外初始化普通静态变量 int main() { Counter c1, c2; Counter::show(); // 输出:Count: 2, MAX: 10 return 0; } ``` --- ### 五、常见错误 - **未在类外初始化普通静态变量** 导致链接错误:`undefined reference to Counter::count`。 - **类内初始化非整型静态常量** 如`static const double PI = 3.14;`会报错(C++11后允许类内初始化,但需使用`constexpr`)。 通过遵循上述规则,可正确管理静态成员的声明、初始化和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值