C++为什么要引入静态成员函数
2016-03-14 14:39
253 查看
在静态成员函数出来之前就已经有了静态成员变量。静态成员变量是为了为用户提供在类级别上访问,而不是类对象有关的数据。静态成员变量在编译期就存在了,而不像非静态成员变量只有实例化了对象才会给分配内存。静态成员变量是所有类对象共享的,例如,我们可以为类定义一个 static int n 来统计实例化了多少个对象,对象构造时 n++ , 析构时 n– 。
但是,如果为类定义的静态成员变量是私有的(不希望暴露在类外),就会遇到下面的问题:
如果,我现在想在类外访问 n , 怎么办呢?
只能定义一个public 成员函数了:
然后实例化一个对象来调用public 成员函数。但是,只是为了访问一个变量就实例化整个对象出来,是不是有点浪费资源呢?况且有些场景下这样做并不能解决问题。
还有一种方法,据说以前程序员都是使用下面的方式:
看起来不错,这样不需要实例化对象出来就达到了目的。但其实这样做很不安全,如果我在 get_n 成员函数中不小心使用了非静态成员变量b , 因为非静态成员只有实例化了对象才会给分配内存,这就会导致正在运行的程序崩溃。但是编译器却不会给报错,留下了安全隐患。
因此,后来C++引入了静态成员函数。
静态成员函数可以直接通过类名访问,也可以使用对象访问。不允许在静态成员函数中使用非静态成员函数和非静态成员变量。
但是,如果为类定义的静态成员变量是私有的(不希望暴露在类外),就会遇到下面的问题:
class A { private: static int n; int b; };
如果,我现在想在类外访问 n , 怎么办呢?
只能定义一个public 成员函数了:
class A { public: int get_n() { return n; } private: static int n; int b; }; ... A a; a.get_n();
然后实例化一个对象来调用public 成员函数。但是,只是为了访问一个变量就实例化整个对象出来,是不是有点浪费资源呢?况且有些场景下这样做并不能解决问题。
还有一种方法,据说以前程序员都是使用下面的方式:
((A*)NULL)->get_n();
看起来不错,这样不需要实例化对象出来就达到了目的。但其实这样做很不安全,如果我在 get_n 成员函数中不小心使用了非静态成员变量b , 因为非静态成员只有实例化了对象才会给分配内存,这就会导致正在运行的程序崩溃。但是编译器却不会给报错,留下了安全隐患。
因此,后来C++引入了静态成员函数。
静态成员函数可以直接通过类名访问,也可以使用对象访问。不允许在静态成员函数中使用非静态成员函数和非静态成员变量。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性