C++:我可以将非静态成员变量的值分配给静态成员变量吗?

C++: Can I assign the value of non-static member variable to static member variable?

本文关键字:静态成员 变量 分配 C++ 我可以      更新时间:2023-10-16

我有一个类A,其中我有一个静态成员函数passName

int A::passName()
{
  .... // skip some code
  std::string name = ...; // result from codes above
  assign(); // this is a static member function in class A
  pointerA->passMethodName(name); // pointerA is a class-A static member variable, but of type 
                                 // class-B, passMethodName is a class-B non-static member function.
}

赋值函数为:

void A::assign(){
  pointerA = tempPointerA;
}

说明: tempPointerA 是在运行过程中生成的值。它是一个非静态私有类 A 成员,每次构造类 A 的新对象时都会对其进行初始化。但是我知道在静态函数中我只能直接使用静态成员,所以我需要确保指针 A 是静态成员。那么 assign() 函数是否可行(或者我宁愿说,这里显示的整个工作原理是否可行)?

谢谢你的想法!

No.静态成员函数只能对静态变量进行操作或调用其他静态函数。(或命名空间范围的函数,它们或多或少与静态函数相同)。

§9.4.1 [类.静态.MFCT]

静态成员函数没有 this 指针。

因此,无法访问static函数中的非静态成员变量。

如果你真的需要assign保持static, then what you should do is to refactor your assign() function to accept a variable of type tempPointerA',然后传入你想要的变量。

int A::passName(B* _in)
{
  std::string name = ...; // result from code above
  assign(_in); // this is a static member function in class A
  _in->passMethodName(name);
}

否则,我建议您根本不static

赋值将起作用,但您需要从非静态方法执行此操作(才能访问tempPointerA)或将指针作为参数传递给静态方法。您可以从非静态函数访问静态成员(但不能相反)。

你应该注意的是所有权和破坏。由于您将值分配给静态成员,因此实例不能再拥有该值。否则,当实例被销毁时,静态成员指向垃圾数据,并且您会收到错误。此外,由于静态成员永远不会被销毁,因此您的值可能会泄漏资源(想想永远不会关闭的数据库连接)。

此外,如果您在多线程环境中,请考虑是否有可能多个线程尝试设置静态成员的值。您可能具有添加同步。如果多个线程尝试同时初始化值,也会遇到争用条件。

有一条规则:静态函数不能在没有对象的情况下访问非静态成员和同一类的函数。 没有相反的规则。 这是因为您没有this指针。

您仍然可以在静态函数中声明同一类的对象并使用它的所有成员,或使用任何静态成员。

因此,您可以从非静态函数访问静态函数和成员。

如果pointerA是静态的,您可以访问所有内容。 不仅是它的静态成员和函数。