目录

成员函数

静态成员

成员函数、静态成员与非静态成员变量的区别


成员函数

当在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. 静态成员:

11-05 18:55