在与同事讨论了在C#3中使用'var'关键字后,我想知道人们对通过var的类型推断的适当用途有什么看法?
例如,我在可疑情况下懒得使用var,例如: -
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
Run Code Online (Sandbox Code Playgroud)
var的更合理用途如下: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Run Code Online (Sandbox Code Playgroud)
有趣的是LINQ似乎有点灰色,例如: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be …Run Code Online (Sandbox Code Playgroud) 我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有可能影响进一步操作的陷阱表示,但有时我想仅使用随机数进行可视化表示,并且不会在其他部分使用它们.例如,程序在视觉效果中设置具有随机颜色的东西,例如:
void updateEffect(){
for(int i=0;i<1000;i++){
int r;
int g;
int b;
star[i].setColor(r%255,g%255,b%255);
bool isVisible;
star[i].setVisible(isVisible);
}
}
Run Code Online (Sandbox Code Playgroud)
是不是比它快
void updateEffect(){
for(int i=0;i<1000;i++){
star[i].setColor(rand()%255,rand()%255,rand()%255);
star[i].setVisible(rand()%2==0?true:false);
}
}
Run Code Online (Sandbox Code Playgroud)
并且还比其他随机数发生器更快?
这似乎auto是一个相当重要的功能,在C++ 11中添加似乎遵循许多较新的语言.与像Python这样的语言一样,我没有看到任何显式变量声明(我不确定是否可以使用Python标准).
使用auto声明变量而不是显式声明它们有缺点吗?
可能重复:
使用C++ 0x auto关键字多少钱
我们(作为社区)是否有足够的经验来确定何时和/或是否滥用汽车?
我真正想要的是最佳实践指南
简单的经验法则可以在80%的情况下快速遵循.
由于上下文这个问题由我的回应引发了这里
有没有办法将auto作为参数传递给另一个函数?
int function(auto data)
{
//DOES something
}
Run Code Online (Sandbox Code Playgroud) 就像我们都知道的那样,break从外部循环中嵌套循环并不容易,没有:
虽然,你必须承认,所有这些都有点笨拙.特别是函数版本缺少,因为缺少调用循环的上下文,因为您需要将循环中所需的所有内容作为参数传递.
另外,第二个对于每个嵌套循环都会变得更糟.
所以,我个人仍然认为该goto版本是最干净的.
现在,考虑所有C++ 0x和东西,第三个选项带给我这个想法利用lambda表达式:
#include <iostream>
bool CheckCondition(){
return true;
}
bool CheckOtherCondition(){
return false;
}
int main(){
[&]{while(CheckCondition()){
for(;;){
if(!CheckOtherCondition())
return;
// do stuff...
}
// do stuff...
}}();
std::cout << "yep, broke out of it\n";
}
Run Code Online (Sandbox Code Playgroud)
这允许return第三种选择提供的简单的语义美,同时不会遇到上下文问题并且(几乎)像goto版本一样干净.它比任何上述选项都更短(以字符为单位).
现在,我已经学会了在找到语言的美妙(ab)使用后保持喜悦,因为几乎总有一些缺点.这个有什么吗?或者甚至有更好的方法来解决这个问题?
我正在努力为自己提出一些一致的规则,以便何时在C++程序中使用'auto'.这是我的pro/con列表,也许你可以通过给我你的意见来帮助我.
优点:
'auto'适用于避免复杂和大型模板声明(例如auto的经典用例,用于在STL容器上定义迭代变量)
'auto'适用于面向未来的代码.例如,如果我有一个int数组并且我想将它更改为无符号整数,如果我在引用该数组的元素时使用'auto',则会自动更新.当然,如果我为数组使用了typedef,那也会发生.
缺点:
'auto'使代码难以阅读.我不知道声明是指针还是值.我不知道它是否有构造函数和析构函数.
'auto'让我很懒.我可以忘记类型,只需编写代码.但在C++中,类型对程序的语义非常重要.
你们什么时候使用Auto?你何时不喜欢使用它?
auto abc = 5566;
Run Code Online (Sandbox Code Playgroud)
据我所知,编译器知道abc是int在编译时,所以它不会影响运行时性能.
但是,它是否会使编译时间更长?
提前致谢.
在GotW 94中,Herb Sutter区分了"经典C++"声明
const char* s = "Hello";
Run Code Online (Sandbox Code Playgroud)
和"现代"风格
auto s = "Hello";
Run Code Online (Sandbox Code Playgroud)
他告诉我们,有一个"中的类型细微的差别s,这里的auto风格是比较正确的." [编辑补充:评论表明,这可能不是Sutter实际意义的公平表示; 见下面的讨论.]
但是......有什么区别?我的印象是a const char *是引用字符串文字的正确方法.此外,当我问我的调试器(lldb)时,它似乎认为类型实际上是相同的:
* thread #1: tid = 0x1756c2, 0x0000000100000f8f test`main + 31 at test.cc:4, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f8f test`main + 31 at test.cc:4
1 int main(void) {
2 const char* s = "Hello";
3 auto t = "Hello";
-> 4 return 0;
5 }
(lldb) fr v
(const …Run Code Online (Sandbox Code Playgroud) 当从C++ 11的开头迭代std::vector到第二个到最后一个元素时,首选的样式是什么?
std::vector<const char*> argv;
std::string str;
Run Code Online (Sandbox Code Playgroud)
应该使用这种更多的C++ - esque方法
for (const auto& s: decltype(argv)(argv.begin(), argv.end()-1)) {
str += std::string(s) + ' ';
}
Run Code Online (Sandbox Code Playgroud)
还是应该采用更传统的方式?
for (size_t i = 0; i < argv.size() - 1; ++i) {
str += std::string(argv[i]);
}
Run Code Online (Sandbox Code Playgroud)