浅析静态成员与成员函数
最佳答案 问答题库538位专家为你答疑解惑
目录
成员函数
静态成员
成员函数、静态成员与非静态成员变量的区别
成员函数
当在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. 静态成员:
静态成员是类级别的成员,它们不依赖于对象实例,因此在实例化对象时不会为静态成员变量分配额外的内存空间。而且静态成员可以不实体化对象,直接通过类就可以调用。不过静态成员变量的初始化通常在类的定义外进行,一般在全局范围或类的命名空间中进行。
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"浅析静态成员与成员函数":http://eshow365.cn/6-33209-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!