const参数

时间:2011-07-19 18:08:20

标签: c++ const

在C ++中,以下内容是否有意义?

main()
{
 int a=10;
 fun(a);
}

void fun(const int a)
{
...
}

我可以看到类似于这个编译的程序,但是有链接器问题。我只是想确认是否在C ++中为const var指定了非const var。

6 个答案:

答案 0 :(得分:5)

是的,没关系。

a无法在fun()中重新分配,就像它会以这样的方式声明一样:

void fun(int param)
{
    const int a(param);

    ...

    a = 5; // this is illegal and won't compile.
}

通过副本传递,无论如何对main()的{​​{1}}都没有影响。即使a的{​​{1}}被声明为非const并已修改。

答案 1 :(得分:3)

如果你在函数中添加了返回类型并且在调用它之前已经向前声明了fun(或者在你的编译单元中颠倒了函数的顺序),那将会很有意义。

对于普通int,它不会更改调用者的任何内容 - 被调用的函数无论更改限定符都无法更改调用者中该变量的值。但是对于被调用的函数,参数是const,因此无法修改 - 这会产生影响,不确定它是否通常“有用”。

现在考虑一下:

int foo(int& a);
int bar(int const& a);

这是两种不同的野兽。 bar只能阅读a,可以采用普通intconst int(或const int&)。

另一方面,

foo如果认为合适,可以更改a,而不能const

有关详细信息,请参阅C ++ FAQ Lite中的Const correctness条目,包括有关如何对const指针应用(或不应用),指向const和指针指向的信息。常量。

答案 2 :(得分:3)

在函数声明中,顶级 1 const被编译器剥离,而它保留在定义中。

原因是顶层元素是复制的,从调用者的角度来看,复制是否是常量并不重要,所以在这一点上是一致的不是问题。另一方面,在函数的定义中,参数cont-ness得以维护,因为它可以帮助编译器检测函数内部参数的意外修改。

基本上是这样的:

void foo( int );
void foo( const int );    // redeclaration of the same function
void foo( const int x ) {
   ++x;                   // error: x is const!!
}

在上面的代码中,有两个完全等效的foo声明(编译器将从声明中删除const)和单个定义。因为定义foo中的x签名被声明为常量整数,所以如果您尝试递增它,编译器会抱怨。

有些人会使用定义中的const来使编译器将++x标记为错误,但这并不常见。另一方面,无论参数是声明为int还是const int,对于调用者来说都是相同的。

1 请注意,这仅适用于顶级const,它适用于通过值和指针传递的参数,但绝不适用于引用(引用始终为const:您无法重新分配引用) 。所以这些是不同的函数声明:

void f( int& );
void f( int const & );
void f( int* );            // equivalent to void f( int * const )
void f( int const * );     // equivalent to void f( int const * const )

答案 3 :(得分:2)

它没有多大意义,因为你在函数中获得的是变量的副本,而不是变量本身。但这是合法的。

答案 4 :(得分:0)

您可以将非const指定给const

答案 5 :(得分:0)

“作业”是好的 - 有趣的是一个新变量,它在乐趣中保持不变。

但乐趣应该有一个返回类型,即无效。 在main中使用它之前应该有一个有趣的声明。