C++静态方法与非静态方法的区别,先看一下使用上的区别:
class Test {
public:
void non_static_fuc() {
// 实现略
}
static static_func() {
// 实现略
}
};
// 非静态方法的使用,必须通过对象调用
Test obj;
obj.non_static_fucn(); // 调用非静态方法
// 静态方法既可以通过对象调用,也可以通过类名调用
obj.static_func(); // 通过对象调用
Test::static_func(); // 通过类名调用
总结几点静态方法和非静态方法的几点主要区别:
非静态方法属于某个对象(类实例),必须通过具体对象调用,调用形式: 对象.方法
静态方法属于类,即可以通过类名::方法调用,也可以通过非静态方法方式调用
非静态方法通过this指针与所属对象关联,静态方法没有this指针
前两点是类非静态方法和静态方法在使用上的区别,第三点是不同的本质原因。
从储存的角度角度将,虽然非静态方法属于对象,但是实际储存时并不是为所有的对象都保存了一个方法,因为所有对象的方法都是相同的,实际保存一份就够了。
于是,之前我就想过,既然非静态方法在内存上也没啥优势,为啥不干脆把所有的方法都定义为静态方法呀,这样调用起来更简单?速度可能更快(因为不用生成实例化)?
其实这么也不无道理,但是C++是面向对象对象编程,面向对象编程主要的特点是啥:抽象、封装、继承和多态。
如果都使用静态函数,抽象和封装好像没啥影响,但是继承和多态肯定没法玩了!
多态实现的基本原理是,在基类将接口函数定义为虚函数,然后子类继承基类并对相关函数进行重写,在调用的时候,是通过this指针进行关联的。
明白上面的内容之后,可以得出以下结论:
如果不考虑继承和多态,那么可以类方法可以是静态的。或者换个角度考虑,如果一个方法与所在的类实例无关,那么就应该是静态的,就像工具类,一般都是静态方法的。
【参考文章】