在C头文件中:
const int AvarInC = 1;
现在在C ++文件中:
class Cpp
{
public:
static const int PublicAvar = 1;
private:
static const int Avar = 1;
};
虽然我有: const int AvarInC = 1;在我的C标题中 要么 static const int AvarInC = 1;在我的C标题中。
会是同一件事吗?第一个没有关键字static,隐式静态吗?
答案 0 :(得分:2)
类似。当然,您也可以在C ++中使用C语言。
但是特定的C ++方式(类成员)在可见性和范围方面也有所不同。只有属于Cpp
类(或朋友)的代码才能访问Avar
。 PublicAvar
介于两者之间;任何人都可以访问它,但他们需要将其称为Cpp.PublicAvar
。
关键字static
在C ++中有两个不同的含义。有时它意味着存储类(如您的示例中所示) - 也就是说,“这不是每个实例的成员”。在这方面,一个完全不属于类成员的变量显然是静态的,而不必声明它。
其他时候,static
可能会引用链接时可见性。静态符号仅在其自己的编译单元内有效。那是原来的C意思。它没有进入您的示例,特别是因为我们假设您的代码进入头文件,因此存在于多个编译单元中。将非成员变量标记为static
将导致程序中的变量的多个副本(每个编译单元一个),这对于const
变量不会有任何影响,但通常会导致非常令人困惑的程序行为。
答案 1 :(得分:1)
如果我理解正确,那么他们就不一样了。由于您将C语言放在头文件中,我假设它将是一个全局常量,因此实际上只有一个副本。它不会每次都需要重新创建(因为static
会做什么。
但是,C ++文件中的那个是在一个类中并且是静态的,所以每次将该类实例化为一个对象时,所有实例都将共享PublicAvar
变量的相同副本,并且它不会用每个对象重新创建。
尽管如此,我有一种感觉,你知道static
做了什么。从技术上讲,不,他们不做同样的事情并且不是同样的事情......但他们的行为也是如此。
我不是专家,所以我错了,但我相信这是对的。希望它有所帮助。
答案 2 :(得分:-1)
“同样”是相当含糊的。两者都将被视为编译时常量。您可以(应该)不在运行时更改它们,编译器可以决定使用此信息来优化您的代码。
答案 3 :(得分:-1)
不,他们不是same
。它们都是在编译时初始化的变量。但是,static
变量可以在不创建object
的任何class
的情况下访问,但non static
变量仅存在于对象中。即,static
变量在内存中为为其创建的任意数量的对象占用公共空间,但在另一个对象的情况下则不行。