类的静态成员函数带来了什么好处,应该在什么时候使用?
2015-05-25 14:10
483 查看
类的静态成员函数好处都是基于:它跟类的实例无关,只跟类有关,不需要this指针。
至于可重入问题,非静态成员函数也有啊。为什么单单问静态函数的可重入问题。
比如:
(1)可以实现某些特殊的设计模式:如Singleton;
(2)由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是那种非成员函数(孤立函数),没有this指针的。比如你可以在类的内部写一个线程函数供CreateThread创建线程用,如果没有静态函数,那么这种回调函数就必须定义成全局函数(非静态成员函数指针无法转换成全局函数指针),从而影响了OO的“封装性”。
(3)可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);如果非要用非静态函数,那就必须:
Math math;
math.sin(3.14);
行是行,只是不爽:就为了一个根本无状态存储可言的数学函数还要引入一次对象的构造和一次对象的析构,当然不爽。而且既然有了对象,说不得你还得小心翼翼的定义拷贝构造函数、拷贝赋值运算符等等,对于一些纯算法的东西显然是不合适的。
(4)总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。
以上只是一些基本的考虑,并不是绝对的。绝对东西的只有一点:“静态函数不需要实例化就可以被调用,不会也不可以调用或操纵非静态成员”。记住这一点,那么实际编程中何时需要用,何时适合用,自然就更容易作出决定了。
至于可重入问题,非静态成员函数也有啊。为什么单单问静态函数的可重入问题。
比如:
(1)可以实现某些特殊的设计模式:如Singleton;
(2)由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是那种非成员函数(孤立函数),没有this指针的。比如你可以在类的内部写一个线程函数供CreateThread创建线程用,如果没有静态函数,那么这种回调函数就必须定义成全局函数(非静态成员函数指针无法转换成全局函数指针),从而影响了OO的“封装性”。
(3)可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);如果非要用非静态函数,那就必须:
Math math;
math.sin(3.14);
行是行,只是不爽:就为了一个根本无状态存储可言的数学函数还要引入一次对象的构造和一次对象的析构,当然不爽。而且既然有了对象,说不得你还得小心翼翼的定义拷贝构造函数、拷贝赋值运算符等等,对于一些纯算法的东西显然是不合适的。
(4)总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。
以上只是一些基本的考虑,并不是绝对的。绝对东西的只有一点:“静态函数不需要实例化就可以被调用,不会也不可以调用或操纵非静态成员”。记住这一点,那么实际编程中何时需要用,何时适合用,自然就更容易作出决定了。
相关文章推荐
- 类的静态成员函数带来了什么好处,应该在什么时候使用?
- 类的静态成员函数带来了什么好处,应该在什么时候使用?
- 类的静态成员函数带来了什么好处,应该在什么时候使用?
- 类的静态成员函数带来了什么好处,应该在什么时候使用?
- 类的静态成员函数带来了什么好处,应该在什么时候使用?
- C++静态成员变量和静态成员函数使用总结
- 关键字static的作用是什么? C++类中的静态成员变量和静态成员函数的作用
- C++静态成员变量和静态成员函数使用总结
- C++使用静态成员函数
- C++静态成员变量和静态成员函数使用总结
- C++静态成员变量和静态成员函数使用总结
- C++类中的静态成员变量与静态成员函数的使用
- 静态变量和成员变量有什么区别?应该怎么调用?
- 类的静态成员函数和静态成员变量的使用
- 第十周刷OJ题 统计程序设计基础课程学生的平均成绩(静态成员函数的使用复习)
- 使用(function() {}).call(this);包裹代码有什么好处,什么时候应该这样做?
- C++静态成员变量和静态成员函数的使用方法总结
- 静态成员函数、this指针、对象指针和动态对象使用小结
- 类的静态成员函数和静态成员变量的使用
- Effective C++ 条款05 什么时候不应该使用编译器默认提供的函数