目录
成员函数
当在C++中实例化(或创建)一个类的对象时,并不会为成员函数分配内存空间。这是因为成员函数(包括普通成员函数和静态成员函数)是属于类级别的,它们并不与对象实例直接关联,而是存储在程序的代码区(Code Segment),因此不需要为它们分配额外的内存空间。
在运行时,所有属于同一个类的对象实例共用类的成员函数代码。这是因为成员函数在编译阶段就已经确定了,属于类的固定部分。 也就是说,类的成员函数是共享的,无论你创建多少个类的对象,它们都只有一份拷贝。
其中,成员函数的调用是通过隐式的this指针来实现的, 当调用成员函数时,通过对象实例中的this指针来确定具体是哪个对象在调用函数,从而让成员函数能够正确地访问对象的成员变量。
虽然类的成员函数不能像静态成员变量那样,不实例化出对象也可以使用,但由于成员函数是依赖类而不是依赖对象的,所以即使是空指针类型的对象,也是可以正常的调用成员函数的。代码示例如下:
#include <iostream>
using namespace std;
class test
{
public:
void _test();
};
void test:: _test()
{
cout << "test" << endl;
}
int main()
{
test* t = nullptr;
t->_test();
return 0;
}
静态成员
静态成员也是类级别的,是属于类本身而不是对象实例的成员。和普通的成员函数一样,静态成员也是在编译阶段就已经确定了的,属于类的固定部分。所以无论创建了多少个对象实例,它们都共享同一块内存空间。
静态成员不依赖于对象实例,因此也不会为静态成员函数分配对象实例的内存空间。静态成员可以直接通过类名来调用,而无需通过对象实例(但非静态成员函数不能这样用)。不过需要注意的是,静态成员变量必须在类的外部进行定义以分配存储空间,而且必须是在全局状态下。因为在类的内部仅仅是声明它们而不是定义。具体可以参考下面的代码示例:
#include <iostream>
using namespace std;
class test
{
public:
//静态成员变量在类内只是声明,需要在类外定义,且只能在全局下定义。
static int num;
};
int test::num = 8;
int main()
{
cout << test::num << endl;
return 0;
}
成员函数、静态成员与非静态成员变量的区别
在C++中,类在实例化(或实体化)时,类内的各种成员(包括非静态成员变量、成员函数以及静态成员变量)都是如何分配空间的,具体情况如下:
1. 非静态成员变量:
2. 成员函数:
3. 静态成员: