同一类中类的静态成员对象
Static member object of a class in the same class
>假设我们有一个类
class Egg
{
static Egg e;
int i;
Egg(int ii):i(ii) {}
Egg(const Egg &); //Prevents copy-constructor to be called
public:
static Egg* instance() {return &e}
};
Egg Egg::e(47);
这段代码保证我们不能创建任何对象,但只能使用静态对象。但是我们如何在类中声明同一类的静态对象。
还有一件事,因为 e 是一个静态对象,而静态对象只能调用静态成员函数,所以这里怎么能为静态对象 e 调用构造函数,它的构造函数也是私有的。
但是我们如何在类中声明同一类的静态对象。
static
成员变量不存储在类的每个对象中。因此,如果在类内声明一个static
成员变量,或者在定义类后将其声明为命名空间级别对象,则仅在访问(Class::var
和var
)和对protected
和private
成员的访问方面有所不同。
还有一件事,因为
e
是一个静态对象,而静态对象只能调用静态成员函数
我认为您正在混合static
函数和static
对象。在 static
函数中,您只能调用static
函数(除非您在对象上调用它们)。
那么如何在这里调用构造函数进行静态对象
e
与所有其他对象一样,也必须为static
对象调用构造函数。
它的构造函数也是私有的
访问控制在C++的类级别进行检查。因此,由于static
对象位于类内部,因此它可以访问private
成员。
与其他一些语言不同,以下内容在C++中是合法的,因为对私有成员的访问是从类内部进行的 - 即使在另一个对象上(在这种情况下other
):
class Test {
private:
int i;
public:
Test(const Test &other)
: i(other.i)
{}
};
但是我们如何在类中声明同一类的静态对象。
通常你需要一个前向引用,但由于 Egg e 是静态的,它实际上是在类定义之外定义的。如果 e 不是静态的,你会收到一个错误(类似于"字段 Egg e 具有不完整的类型")。
还有一件事,因为 e 是一个静态对象,而静态对象只能调用静态成员函数,所以这里怎么能为静态对象 e 调用构造函数。
这并不完全正确。 类中的静态成员函数只能访问静态成员数据。static Egg e 是 Egg 的一个实例,因此它可以访问常规 Egg 可以访问的所有成员和数据。
它的构造函数也是私有的。
任何私有成员都可以在类中使用。由于静态 Egg e 被声明为 Egg 的成员,因此它可以使用私有构造函数。e 的定义在类之外,因为它是静态的,但它仍然是类成员。
最后,您的代码无法编译,因为您在此处遗漏了分号:
static Egg* instance() {return &e;}
- 类的全局对象和静态成员
- 非静态成员引用必须相对于特定对象
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 在初始化类的静态对象之前,是否保证初始化该类的静态成员?
- 返回本地静态的函数和返回静态成员的函数之间有什么区别(对象大小、性能等)?
- C :在没有对象实例的情况下调用非静态成员函数
- 不确定如何修复;非静态成员参考必须相对于特定对象
- 将对象数限制为1可以使用点运算符访问静态成员的1
- Visual 2015 C++编译器:使用对象调用静态成员不会导致编译器错误
- 在不存在的对象上调用静态成员函数
- 在没有对象参数编译器错误的情况下调用非静态成员函数
- 多态性:通过类文本或对象访问静态成员
- 请澄清术语类静态对象(相对于类静态成员)
- C 功能指针指向静态指针对象的成员功能
- 同一类中类的静态成员对象
- 静态成员对象链接错误
- 静态成员对象初始化
- 调用c++中静态成员对象的函数
- 延迟构造静态成员对象