关于C++中的静态成员

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用(但不属于任何一个对象)。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。

静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>

 

     在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。

 

第一个例子,通过类名调用静态成员函数和非静态成员函数

class Point

{

public:   

       void init()

       { 

       }

       static void output()

       {

       }

};

void main()

{

       Point::init();

       Point::output();

}

编译出错:error C2352: 'Point::init' : illegal call of non-static member function

结论1:不能通过类名来调用类的非静态成员函数。

 

第二个例子,通过类的对象调用静态成员函数和非静态成员函数

将上例的main()改为:

void main()

{

       Point pt;

       pt.init();

       pt.output();

}

编译通过。

结论2:类的对象可以使用静态成员函数和非静态成员函数。

 

第三个例子,在类的静态成员函数中使用类的非静态成员

#include <stdio.h>

class Point

{

public:   

       void init()

       { 

       }

       static void output()

       {

              printf("%d\n"m_x);

       }

private:

       int m_x;

};

void main()

{

       Point pt;

       pt.output();

}

编译出错:error C2597: illegal reference to data member 'Point::m_x' in a static member function

因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。

结论3静态成员函数中不能引用非静态成员。

 

第四个例子,在类的非静态成员函数中使用类的静态成员

class Point

{

public:   

       void init()

       { 

              output();

       }

       static void output()

       {

       }

};

void main()

{

       Point pt;

       pt.output();

}

编译通过。

结论4:类的非静态成员函数可以调用用静态成员函数,但反之不能。

 

第五个例子,使用类的静态成员变量

#include <stdio.h>

class Point

{

public:   

       Point()

       { 

              m_nPointCount++;

       }

       ~Point()

       {

              m_nPointCount--;

       }

       static void output()

       {

              printf("%d\n"m_nPointCount);

       }

private:

       static int m_nPointCount;

};

void main()

{

       Point pt;

       pt.output();

}

Ctrl+F7编译无错误,按F7生成EXE程序时报链接错误

error LNK2001: unresolved external symbol "private: static int Point::m_nPointCount" (?m_nPointCount@Point@@0HA)

这是因为类的静态成员变量在使用前必须先初始化。

main()函数前加上int Point::m_nPointCount = 0;

再编译链接无错误,运行程序将输出1

结论5

 类的静态成员变量必须先初始化再使用。



结合上面的五个例子,对类的静态成员变量和成员函数作个总结

一。静态成员函数中不能调用非静态成员。

二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。

三。静态成员变量使用前必须先初始化(int MyClass::m_nNumber = 0;),否则会在linker时出错。

 


   

<think>首先,用户的问题是:“我想理解C++静态成员的概念 请问C++ 静态成员的定义和作用”。所以,我需要基于提供的引用和系统指令来回答。 系统指令包括: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 提供的引用是关于C++静态成员的: - 引用[1]:讨论静态成员变量和函数,包括特性、定义方式和访问规则。 - 引用[2]:总结静态成员变量和函数,强调静态数据成员是类域中的全局变量,定义时不受访问限制。 - 引用[3]:示例如何通过静态成员函数访问静态成员变量。 我的回答需要结构化: 1. **定义静态成员**:解释什么是静态成员,包括变量和函数。 2. **作用**:描述静态成员的作用和好处。 3. **示例代码**:提供代码示例来演示。 4. **引用**:在相关部分添加引用标识。 5. **生成相关问题**:在最后添加相关问题。 关键点从引用中提取: - **静态成员变量**: - 所有对象共享,不属于单个对象。 - 存储在静态区。 - 必须在类外定义(初始化)。 - 访问方式:类名::变量名 或 对象.变量名。 - 受访问限定符限制(public/protected/private)。 - **静态成员函数**: - 没有this指针,只能访问静态成员。 - 可以直接通过类名调用。 - 用于访问静态成员变量。 在回答中,使用中文。确保数学表达式正确格式化,但在这个主题中,可能没有太多数学内容;如果有,比如讨论大小或计算,就用$...$。 结构回答: - 引言:简要介绍静态成员。 - 定义静态成员变量:解释概念、特性、定义方式。 - 定义静态成员函数:解释概念、特性、用法。 - 作用:总结好处,如共享数据、全局访问。 - 代码示例:提供简单C++代码演示。 - 引用:在适当地方添加[^1]、[^2]、[^3]。 - 相关问题:生成2-3个相关问题。 最后,生成相关问题,如: 1. 静态成员变量和普通成员变量的区别? 2. 静态成员函数如何访问非静态成员? 3. 静态成员在多线程环境中的问题?</think>### C++静态成员的概念、定义和作用 在C++中,静态成员static member)是一种特殊类成员,包括静态成员变量静态成员函数。它们与类本身关联,而非类的单个对象,从而提供了一种共享数据和行为的方式。下面我将逐步解释其定义、作用,并结合代码示例说明。 #### 1. **静态成员的定义** - **静态成员变量**: - 静态成员变量在类中声明时使用 `static` 关键字,但必须在类外单独定义和初始化。这类似于全局变量,但作用域限定在类内。 - 例如,在类中声明 `static int count;`,然后在类外定义 `int ClassName::count = 0;`。定义时不受类访问限定符(如 `private`)限制,但声明时受控[^2]。 - 特性: - 所有对象共享同一份数据,存储在静态区(非堆或栈)。 - 访问方式:通过类名(`ClassName::varName`)或对象(`obj.varName`)访问。 - 受 `public`、`protected`、`private` 访问规则约束[^1]。 - **静态成员函数**: - 在类中声明时使用 `static` 关键字,定义时不需 `static`。 - 特性: - 没有隐藏的 `this` 指针,因此不能直接访问非静态成员(如普通成员变量)。 - 主要用于操作静态成员变量。 - 访问方式:直接通过类名调用(`ClassName::functionName()`),或通过对象调用[^3]。 静态成员的本质是类级别的全局变量和函数,共享于所有实例,这避免了重复存储[^1][^2]。 #### 2. **静态成员的作用** 静态成员的核心作用是实现数据共享和全局访问,具体好处包括: - **共享数据**:静态成员变量允许所有对象共享同一数据,例如用于计数器、配置信息或全局状态跟踪。比如,一个 `Student` 类中,`static int totalStudents` 可以记录所有学生对象的总数[^1]。 - **全局访问点**:静态成员函数提供无需创建对象即可访问类功能的接口。例如,工具类中的数学计算函数(如 `Math::sqrt()`),可直接调用而不实例化对象[^3]。 - **资源优化**:减少内存开销,因为静态变量只存在一份副本,适合存储常量或共享资源(如数据库连接池)。 - **封装性**:通过访问限定符(如 `private`),可以控制静态成员的访问权限,避免全局变量带来的命名冲突[^2]。 作用总结:静态成员增强了类的封装性,同时提供高效的数据共享机制,常用于单例模式、工具类和性能敏感场景[^1][^3]。 #### 3. **代码示例** 以下是一个简单示例,展示静态成员变量和函数的定义、初始化及使用: ```cpp #include <iostream> using namespace std; class Counter { private: static int count; // 静态成员变量声明(类内) public: Counter() { count++; // 构造函数中增加计数 } // 静态成员函数声明 static int getCount() { return count; // 只能访问静态成员 } }; // 静态成员变量定义和初始化(类外) int Counter::count = 0; int main() { cout << "初始计数: " << Counter::getCount() << endl; // 通过类名访问静态函数 Counter obj1; Counter obj2; cout << "对象计数: " << obj1.getCount() << endl; // 通过对象访问静态函数 cout << "类名计数: " << Counter::getCount() << endl; // 直接通过类名访问 return 0; } ``` **输出:** ``` 初始计数: 0 对象计数: 2 类名计数: 2 ``` **解释:** - `static int count` 被所有 `Counter` 对象共享,每次创建对象时构造函数递增它。 - `static int getCount()` 无 `this` 指针,直接返回 `count`。 - 注意:静态变量必须在类外定义(`int Counter::count = 0;`),否则编译错误[^2][^3]。 #### 4. **注意事项** - **定义位置**:静态成员变量必须在类外定义(通常在.cpp文件),否则会导致链接错误。这不同于普通成员变量[^2]。 - **访问限制**:静态成员函数不能访问非静态成员,因为缺少 `this` 指针。如果需要操作对象数据,需传递对象引用[^3]。 - **线程安全**:在多线程环境中,静态成员可能引发竞争条件,需使用同步机制(如互斥锁)。 通过以上解释,静态成员C++中优化资源和管理共享状态的关键工具[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值