C++成员函数与静态成员函数区别

C++成员函数与静态成员函数区别

C++ 中的 成员函数 是指定义在 的内部的 函数,C++ 中的成员函数支持 函数重载函数默认值。C++ 中的 静态成员函数 是指使用 static 修饰的成员函数。

普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问 静态成员变量。编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。

而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。

静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。

C++成员函数和静态成员函数调用区别

属性 调用方法
静态成员函数 C++ 的静态成员函数调用方法有两种,一种是通过 “类名::成员函数名” 的方法,另一种是通过 “对象.成员函数名” 的方法来调用。
成员函数 C++ 的普通成员变量只能通过 “对象.成员函数名” 的方法来调用。

C++成员函数和静态成员函数访问性区别

属性 作用域
静态成员函数 静态成员函数只能访问静态成员变量,不能访问非静态成员变量。
成员函数 普通成员函数可以访问所有成员,包括静态成员变量和非静态成员变量。

案例

静态成员函数只能访问静态成员

静态成员函数只能访问静态成员

#include <iostream> using namespace std; class Student { public: Student() { } static void learing() { cout << "I am learing " << course << endl; } static string course; }; string Student::course = "C++"; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; Student stu; stu.learing(); Student::learing(); return 0; }

程序运行后,控制台输出如下:

19_C成员方法与静态成员方法区别.png

我们创建了一个类 Student,接着,为该类添加了一个静态成员变量 course,和一个静态成员函数 learing。接着,我们创建了一个 Student 类的实例,并通过实例来调用静态成员函数。

同时,在静态成员函数里面,我们访问了静态成员变量,最后,我们发现,在静态成员函数里面可以访问静态成员变量,并且,静态成员函数可以使用对象来调用也可以使用类来调用。现在,我们给类增加一个非静态成员变量,修改程序如下:

#include <iostream> using namespace std; class Student { public: Student(string sname) { name = sname; } static void learing() { cout << "I am " << name << " and i am learing " << course << endl; } string name; static string course; }; string Student::course = "C++"; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; Student stu("HaiCoder"); stu.learing(); Student::learing(); return 0; }

程序运行后,控制台输出如下:

20_C成员方法与静态成员方法区别.png

这次,我们在静态成员函数里面,调用了非静态成员变量,我们看到,程序报错了,因为在静态成员函数里面只能调用静态成员变量。

非静态成员函数可以访问所有成员变量

非静态成员函数可以访问所有成员变量

#include <iostream> using namespace std; class Student { public: Student(string sname) { name = sname; } void learing() { cout << "I am " << name << "and i am learing " << course << endl; } string name; static string course; }; string Student::course = "C++"; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; Student stu("HaiCoder"); stu.learing(); return 0; }

程序运行后,控制台输出如下:

21_C成员方法与静态成员方法区别.png

我们可以看到,我们在非静态成员函数里面访问了静态成员变量和非静态成员变量,因此,非静态成员函数可以访问所有的成员变量。现在,我们尝试使用类名直接访问成员函数,修改程序如下:

#include <iostream> using namespace std; class Student { public: Student(string sname) { name = sname; } void learing() { cout << "I am " << name << "and i am learing " << course << endl; } string name; static string course; }; string Student::course = "C++"; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; Student stu("HaiCoder"); Student::learing(); return 0; }

程序运行后,控制台输出如下:

22_C成员方法与静态成员方法区别.png

这次,我们使用了类名直接访问非静态成员函数,我们看到,程序报错了,因为在非静态成员函数里面只能使用对象来调用。

C++成员函数与静态成员函数区别总结

C++ 的静态成员函数调用方法有两种,一种是通过 “类名::成员函数名” 的方法,另一种是通过 “对象.成员函数名” 的方法来调用。C++ 的普通成员变量只能通过 “对象.成员函数名” 的方法来调用。

普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)