![]() |
#2
woodhead2006-07-06 17:01
![]() 特别是在一个学期的开始,我常常收到许多关于编写一个非常简单的程序的询问。这个问题 有一个很具代表性的解决方法,那就是(在你的程序中)读入几个数字,对它们做一些处理, 再把结果输出。下面是一个这样做的例子: #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<double> v; double d; while(cin>>d) v.push_back(d); // 读入元素 if (!cin.eof()) { // 检查输入是否出错 cerr << "format error\n"; return 1; // 返回一个错误 } cout << "read " << v.size() << " elements\n"; reverse(v.begin(),v.end()); cout << "elements in reverse order:\n"; for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n'; return 0; // 成功返回 } 对这段程序的观察: 这是一段标准的 ISO C++程序,使用了标准库(standard library)。标准库工具在命 名空间std中声明,封装在没有.h 后缀的头文件中。 如果你要在 Windows 下编译它,你需要将它编译成一个“控制台程序”(console application)。记得将源文件加上.cpp 后缀,否则编译器可能会以为它是一段 C 代码 而不是 C++。 是的,main()函数返回一个 int值。 读到一个标准的向量(vector)中,可以避免在随意确定大小的缓冲中溢出的错误。读到一 个数组(array)中,而不产生“简单错误”(silly error),这已经超出了一个新手的能 力——如果你做到了,那你已经不是一个新手了。如果你对此表示怀疑,我建议你阅读我的 文章“将标准 C++作为一种新的语言来学习”("Learning Standard C++ as a New Language"),你可以在本人著作列表(my publications list)中下载到它。 !cin.eof()是对流的格式的检查。事实上,它检查循环是否终结于发现一个 end-of-file(如果不是这样,那么意味着输入没有按照给定的格式)。 见你的C++教科书中的“流状态”(stream state)部分。 vector知道它自己的大小,因此我不需要计算元素的数量。 这段程序没有包含显式的内存管理。Vector维护一个内存中的栈,以存放它的元素。当一 个 vector 需要更多的内存时,它会分配一些;当它不再生存时,它会释放内存。于是, 使用者不需要再关心 vector中元素的内存分配和释放问题。 程序在遇到输入一个“end-of-file”时结束。如果你在 UNIX 平台下运行它, “end-of-file”等于键盘上的 Ctrl+D。如果你在 Windows平台下,那么由于一个BUG 它无法辨别“end-of-file”字符,你可能倾向于使用下面这个稍稍复杂些的版本,它使 用一个词“end”来表示输入已经结束。 #include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; int main() { vector<double> v; double d; while(cin>>d) v.push_back(d); // 读入一个元素 if (!cin.eof()) { // 检查输入是否失败 cin.clear(); // 清除错误状态 string s; cin >> s; // 查找结束字符 if (s != "end") { cerr << "format error\n"; return 1; // 返回错误 } } cout << "read " << v.size() << " elements\n"; reverse(v.begin(),v.end()); cout << "elements in reverse order:\n"; for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n'; return 0; // 成功返回 } [此贴子已经被作者于2006-7-10 8:57:26编辑过] |
Bjarne Stroustrup对一些常见问题的答复,不一定因为是Bjarne Stroustrup说的就怎么怎么样,不过毕竟他是个很有水平的
原文的地址为:http://www.research.att.com/~bs/bs_faq.html
中文的从网上发现的,翻译为左轻侯,这里只是一部分的问题
问题 楼层
我如何写个非常简单的程序? 2
为什么一个空类的大小不为 0? 3
为什么析构函数默认不是 virtual 的? 4
为什么不能有虚拟构造函数? 5
我能够在构造函数中调用一个虚拟函数吗? 6
为什么重载在继承类中不工作? 7
怎样将一个整型值转换为一个字符串? 8
我应该将“const”放在类型之前还是之后? 9
“int* p”正确还是“int *p”正确? 10
为什么 delete 不会将操作数置 0? 11
我能够写“void main()”吗? 12
我如何定义一个类内部(in-class)的常量? 13
我为什么必须使用一个造型来转换*void? 14
有没有“指定位置删除”(placement delete)? 15
为什么编译要花这么长的时间? 16
我必须在类声明处赋予数据吗? 17
我能防止别人继承我自己的类吗? 18
为什么不能为模板参数定义约束(constraints)? 19
什么是函数对象(function object)? 20
我应该如何对付内存泄漏? 21
我为什么在捕获一个异常之后就不能继续? 22
怎样从输入中读取一个字符串? 23
为什么 C++不提供“finally”的构造? 24
为什么我不能重载点符号,::,sizeof,等等? 25
使用宏有什么问题? 26