你走多远const
?您是否只是const
在必要时制作功能,或者您是否全力以赴并在任何地方使用它?例如,想象一个简单的mutator,它接受一个布尔参数:
void SetValue(const bool b) { my_val_ = b; }
Run Code Online (Sandbox Code Playgroud)
这const
实际上有用吗?我个人选择广泛使用它,包括参数,但在这种情况下,我想知道它是否值得?
我还惊讶地发现你可以省略const
函数声明中的参数,但可以将它包含在函数定义中,例如:
.h文件
void func(int n, long l);
Run Code Online (Sandbox Code Playgroud)
.cpp文件
void func(const int n, const long l)
Run Code Online (Sandbox Code Playgroud)
是否有一个原因?这对我来说似乎有点不寻常.
我最近在javascript中遇到了const关键字.据我所知,它用于创建不可变变量,我已经测试过以确保它不能重新定义(在node.js中):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Run Code Online (Sandbox Code Playgroud)
我意识到它还没有在所有浏览器中标准化 - 但我只对node.js/v8的上下文感兴趣,并且我注意到当使用var关键字时,某些开发人员/项目似乎非常喜欢它达到同样的效果.
问题?
何时使用const代替var?
是否应该在每次声明不会重新分配的变量时使用它?
如果使用var代替const,反之亦然,它实际上是否有任何区别?
在尝试编译我的类时,我收到一个错误:
常量
'NamespaceName.ClassName.CONST_NAME'
不能标记为静态.
在线:
public static const string CONST_NAME = "blah";
Run Code Online (Sandbox Code Playgroud)
我可以用Java一直这样做.我究竟做错了什么?为什么不让我这样做?
我看到以下情况很好:
const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;
Run Code Online (Sandbox Code Playgroud)
但是,这是不正确的:
export default const Tab = connect( mapState, mapDispatch )( Tabs );
Run Code Online (Sandbox Code Playgroud)
这很好:
export default Tab = connect( mapState, mapDispatch )( Tabs );
Run Code Online (Sandbox Code Playgroud)
可以解释一下,为什么const
无效export default
?这是一个不必要的补充和任何宣称为export default
假定的东西const
吗?
这是我使用const时得到的错误:
<error line="2" column="1" severity="warning" message="'const' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz)." source="jshint.W104" />
Run Code Online (Sandbox Code Playgroud)
我的代码看起来像这样:
const Suites = {
Spade: 1,
Heart: 2,
Diamond: 3,
Club: 4
};
Run Code Online (Sandbox Code Playgroud)
代码工作正常只有JSHint每次都警告我.
以下定义之间有区别吗?
const double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;
Run Code Online (Sandbox Code Playgroud)
如果没有,在C++ 11中首选哪种风格?
有什么区别:
char * const
Run Code Online (Sandbox Code Playgroud)
和
const char *
Run Code Online (Sandbox Code Playgroud) 我已经玩ES6一段时间了,我注意到虽然声明的变量var
按预期提升了......
console.log(typeof name); // undefined
var name = "John";
Run Code Online (Sandbox Code Playgroud)
... 用吊装声明let
或const
似乎有一些问题的变量:
console.log(typeof name); // ReferenceError
let name = "John";
Run Code Online (Sandbox Code Playgroud)
和
console.log(typeof name); // ReferenceError
const name = "John";
Run Code Online (Sandbox Code Playgroud)
这是否意味着变量声明let
或未声明const
?这是怎么回事?这个问题let
和const
这个问题有什么区别吗?
假设class X
我想要返回内部成员的访问权限:
class Z
{
// details
};
class X
{
std::vector<Z> vecZ;
public:
Z& Z(size_t index)
{
// massive amounts of code for validating index
Z& ret = vecZ[index];
// even more code for determining that the Z instance
// at index is *exactly* the right sort of Z (a process
// which involves calculating leap years in which
// religious holidays fall on Tuesdays for
// the next thousand years or so)
return ret;
}
const …
Run Code Online (Sandbox Code Playgroud) 为什么不允许对一个临时对象进行非const引用,哪个函数getx()
返回?显然,这是C++标准禁止的,但我对这种限制的目的感兴趣,而不是对标准的引用.
struct X
{
X& ref() { return *this; }
};
X getx() { return X();}
void g(X & x) {}
int f()
{
const X& x = getx(); // OK
X& x = getx(); // error
X& x = getx().ref(); // OK
g(getx()); //error
g(getx().ref()); //OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ref()
可以修改临时对象. ref()
允许您欺骗编译器并获取此临时对象的链接,这解决了我们的问题.此外:
他们说"为const引用分配一个临时对象可以延长这个对象的生命周期","但是对于非const引用却没有任何说法".我的其他问题.以下赋值是否延长了临时对象的生命周期?
X& x = getx().ref(); // OK
Run Code Online (Sandbox Code Playgroud)