C ++函数体中的Const变量

时间:2013-12-30 13:29:59

标签: c++

我相信我有这个问题,但我只是想确认一下。如果我有两个功能,

function A()
{
    const Vector3D vectorA(1.0f);
    ...
}

function B(float var)
{
    const Vector3D vectorB(1.0f + var);
    ...
}

对于函数A()vectorA只会在程序中构造一次,无论A()次调用多少次?我相信编译器隐式声明它是静态的是吗? 但是在B()的情况下,每个函数调用需要重构vectorB吗?

4 个答案:

答案 0 :(得分:4)

两个函数都会在每次调用时创建变量。没有隐含的静态。有些编译器可能会选择优化,但它不是语言规范的一部分。

答案 1 :(得分:1)

在这两种情况下都不会在每次通话时创建对象 为什么编译器在第一种情况下会隐式提供static

答案 2 :(得分:1)

In the case of function A(), will vectorA only be constructed once in the program, no matter how many A() calls?

没有。如果您只需要vectorA的一个结构,则需要将其声明为static

const static Vector3D vectorA(1.0f);

I believe the compiler implicitly declares it static yes?

不要假设。

答案 3 :(得分:1)

答案是,但是 远离轨道。

static是一个非常重载的关键字:

  • static方法是未在类
  • 的实例上调用的方法
  • static属性是对于类
  • 的所有实例仅存在一次的属性
  • static函数具有内部链接
  • static变量,在命名空间范围内,具有内部链接
  • 在功能范围内的static变量也称为本地静态;它是在执行流第一次通过其定义时构建的,然后在调用它所属的函数之间保留其状态。

在所有这些用途中,单个用户可以(实际上)是隐式的:命名空间范围内的constconstexpr变量具有内部链接(就好像它是静态的)除非使用其他存储限定符(例如extern)。

  

§3.5计划和联系[basic.link]

     

3 /具有命名空间范围(3.3.6)的名称具有内部链接(如果它是

的名称)      
      
  • 显式声明为static的变量,函数或函数模板;或者,
  •   
  • 显式声明为constconstexpr的变量,既未明确声明为extern,也未声明为具有外部链接;或
  •   
  • 匿名工会的数据成员。
  •   

不要constconstexpr这样从不暗示static,而是在第二个项目符号中突出显示的变量声明的特定情况在命名空间范围对链接具有相同的效果。