C++ “究竟是什么?”;“静态”;声明时的意思是;“全球”;C+中的变量+;?
这是一个范围的扩展 什么是静态的,如何使用,以及在处理C++时,使用“静态”的目的是什么?C++ “究竟是什么?”;“静态”;声明时的意思是;“全球”;C+中的变量+;?,c++,static-variables,static,C++,Static Variables,Static,这是一个范围的扩展 什么是静态的,如何使用,以及在处理C++时,使用“静态”的目的是什么? 谢谢。这意味着该变量是翻译单元的本地变量(简单地说,是单个源文件),不能从外部访问。静态的使用实际上是在当前的C++标准中被禁止的,而应该使用匿名的命名空间: static int x = 0; 应该是: namespace { int x = 0; } 静态基本上意味着变量与程序的生命周期相关联,而不是与任何给定的函数或类实例相关联。你应该什么时候使用它?不要。目的何在?主要
谢谢。这意味着该变量是翻译单元的本地变量(简单地说,是单个源文件),不能从外部访问。静态的使用实际上是在当前的C++标准中被禁止的,而应该使用匿名的命名空间:
static int x = 0;
应该是:
namespace {
int x = 0;
}
静态基本上意味着变量与程序的生命周期相关联,而不是与任何给定的函数或类实例相关联。你应该什么时候使用它?不要。目的何在?主要是调试数据
一般来说,在C++中,如果你发现自己使用静态数据,那么你就错了。有时这是合适的,但却非常罕见。这类内容似乎涵盖得相当充分 但换言之,C中有两种用法
静态类成员是与类本身关联的数据和函数,而不是与类的对象关联的数据和函数 在下面的示例中,类Fred有一个静态数据成员x_u和一个实例数据成员y_u。无论创建了多少Fred对象(不包括Fred对象),只有一个Fred::x_u副本,但每个Fred对象都有一个y_u副本。因此,x_u被称为与类关联,y_u被称为与类的单个对象关联。类似地,类Fred有一个静态成员函数f()和一个实例成员函数g()
class{
公众:
在爪哇C++中,当静态被用于一个类中时,它或多或少意味着它在这个过程中所做的事情。对于变量,它意味着变量的11个实例存在于所有类和函数中,这意味着函数根本不隐式访问这个指针。
<>在C和C++中,当静态变量被用于全局变量或函数时,则意味着变量只能在当前C或C++文件中引用。换句话说,编译器不必为变量或函数生成任何重定位符号。
当静态函数在局部函数中的变量旁边使用时,它表示变量不超出范围,但它将保留其从函数调用到函数调用的值。该变量实际上是一个只能从给定函数中访问的全局变量。
< P> > C++ > D >代码>静态< /代码>在C++、D中有不同的含义。依附于上下文
当声明自由函数或全局变量时,这意味着该函数在单个转换单元之外不可用:
// test.cpp
static int a = 1;
static void foo() {}
如果编译该翻译单元的结果与包含符号a
和foo
的不同翻译单元链接,则不会违反一个定义规则,因为在该特定翻译单元中a
和foo
是专用符号。未命名名称空间已不再使用这种用法
// test2.cpp
namespace {
static int a = 1;
static void foo() {}
}
在函数中声明局部变量时,这意味着变量的生存期将从函数的第一次调用一直延续到程序结束,而不仅仅是在调用期间:
int foo() {
static int counter = 0;
return ++counter;
}
int main() {
for ( int i = 0; i < 10; ++i ) {
std::cout << foo() << std::endl;
}
}
在这种情况下,成员x
是一个非静态成员属性,因此类的每个实例都有一个不同的x
。在示例程序t.x
和other.x
中,x
引用不同的整数。另一方面y
是static
,因此有一个t.y
和other.y
这两种用法都引用相同的变量。成员方法也是如此。如果它们是静态的,则它们是类级方法,可以在没有实例的情况下调用,而如果它们是非静态的,则应用于具体实例和<必须使用code>a.b或a->b
语法
<> >使用<代码>静态< /代码>类似于java中使用相同的关键字,而其他两个在该语言中不存在。在java中没有使用C++中的关键字的一种用法,即静态类初始化器的使用(在类级别的代码块由“代码>静态{}} /代码>”包围)。在爪哇,当类加载时,代码块将被执行,而只有一次。C++中的静态成员变量初始化必须在变量定义的初始化器中完成。但是“前一个问题”是关于java的。取决于你所谈论的静态用法。我最喜欢的引文之一。“这不是C++的新版本,除非它们找到了静态的新用法。"“肯尼……是的,我知道。这就是为什么我想扩大范围考虑C/C++。我用java得到答案,我想知道在处理C/C++时是否有所不同。@ JaveDPAR……我不太确定我在说的用法。你能回答一个答案吗?指定不同的用法,每一个的优点/缺点等等……尽管答案之一
int foo() {
static int counter = 0;
return ++counter;
}
int main() {
for ( int i = 0; i < 10; ++i ) {
std::cout << foo() << std::endl;
}
}
struct test {
int x;
static int y;
};
int test::y; // need to define it in one translation unit
int main() {
// test::x = 5; // !error cannot access a non-static member variable
// without an instance
test::y = 5; // ok
test t, other;
t.x = 10; // ok
t.y = 15; // ok, the standard allows calling a static member through
// an instance, but this is the same as test::y
}