在C ++中,以下内容是否有意义?
main()
{
int a=10;
fun(a);
}
void fun(const int a)
{
...
}
我可以看到类似于这个编译的程序,但是有链接器问题。我只是想确认是否在C ++中为const var指定了非const var。
答案 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
,可以采用普通int
或const 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中使用它之前应该有一个有趣的声明。