C++ 类的静态成员是否可以与它在C+中所属的类的类型相同+;
假设我有C++ 类的静态成员是否可以与它在C+中所属的类的类型相同+;,c++,class,static,C++,Class,Static,假设我有 class : foo { public: static const foo Invalidfoo; foo(); foo(int, string); private: int number; std::string name; }; 它是否安全或容易出现任何问题 编辑: 我想使用它返回一个无效对象作为启动错误的引用。这是合法的 事实上,它广泛应用于 单例多线程访问和创建问题 这是一篇很好的文章: 这是合法的 事实上,它广泛应用于 单例多线程访问和创建问题
class : foo
{
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
};
它是否安全或容易出现任何问题
编辑:
我想使用它返回一个无效对象作为启动错误的引用。这是合法的
事实上,它广泛应用于
单例多线程访问和创建问题
这是一篇很好的文章:
这是合法的
事实上,它广泛应用于
单例多线程访问和创建问题
这是一篇很好的文章:
它就像一个全局变量或单例变量。它很容易出现与这些相关的问题。它就像一个全局变量或单例变量。它很容易出现与这些相关的问题。这是非常有效的代码。它没有任何理由引起任何问题,因为静态数据成员不会影响类的大小。无论在一个类中定义了多少静态数据成员,它的大小都不会改变一个字节
struct A
{
int i;
char c;
};
struct B
{
int i;
char c;
static A a;
static B b;
};
在上面的代码中,sizeof(A)==sizeof(B)
将始终为真。请参阅此演示:
由C++标准(2003),
所支持的$7.4.2/1节支持 静态数据成员不是 类的子对象。有一个 只有一个静态数据成员的副本 由的所有对象共享 班级 不能定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实会影响类的大小。由于数据成员的递归性质,它在计算类的大小时会导致问题请参见本主题:
- 这是完全有效的代码。它没有任何理由引起任何问题,因为静态数据成员不会影响类的大小。无论在一个类中定义了多少静态数据成员,它的大小都不会改变一个字节
struct A
{
int i;
char c;
};
struct B
{
int i;
char c;
static A a;
static B b;
};
在上面的代码中,sizeof(A)==sizeof(B)
将始终为真。请参阅此演示:
由C++标准(2003),
所支持的$7.4.2/1节支持 静态数据成员不是 类的子对象。有一个 只有一个静态数据成员的副本 由的所有对象共享 班级 不能定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实会影响类的大小。由于数据成员的递归性质,它在计算类的大小时会导致问题请参见本主题:
- 这是合法的。从实用/风格的角度来看,这是一个糟糕的代码,但它是合法的,而且从技术上讲,它可以正常工作。比单例更好,因为它是不可变的。它是合法的。从实用/风格的角度来看,这是一个糟糕的代码,但它是合法的,而且从技术上讲,它可以正常工作。比Singleton更好,因为它是不可变的。这是完全合法的,但以下几点更好:
class foo:
{
public:
static const& foo Invalidfoo()
{
static foo Invalidfoo_;
return Invalidfoo_;
}
private:
foo();
};
这样可以保证对象在第一次使用时就被初始化
编辑:但无论您如何操作,您仍然有一个全局对象,这可能是问题的原因。最好的解决方案可能是在每次需要默认构造对象时调用默认构造函数。就效率而言,差异可能是可以忽略的。这是完全合法的,但以下几点更好:
class foo:
{
public:
static const& foo Invalidfoo()
{
static foo Invalidfoo_;
return Invalidfoo_;
}
private:
foo();
};
这样可以保证对象在第一次使用时就被初始化
编辑:但无论您如何操作,您仍然有一个全局对象,这可能是问题的原因。最好的解决方案可能是在每次需要默认构造对象时调用默认构造函数。就效率而言,差异可能是可以忽略的。这实际上是单例的实现方式,除了静态成员是指针之外。所以,是的,您是安全的。这实际上就是单例的实现方式,除了静态成员是指针之外。是的,你很安全