2008年9月20日星期六

[TIC++] C2. Making objects

代码阅读 <Thinking in C++>
Chapter 2. Making Objects


一、第一个C++程序

//hello.cpp---------------------
#include <iostream>
using namespace std;

// cout is an object
// `<<' is an overloaded operator
// `namespace' is used to prevent name collisionx
int main(void)
{
cout << "Hello world! "
<< "I am " << 8
<< " today!"<< endl;
}

这是C++的第一个代码程序。和大多其他语言的教材一样,Bruce Eckel也选择了`Hello
world!'这样一个程序来开启C++之门。这个程序的框架和C极其相似,有头文件包含,main
函数等等。

1. <iostream>是C++的标准头文件,这些头文件包含了标准数据结构定义和函数的索引。他
们位于: /usr/lib/gcc/i686-pc-linux-gnu/4.3.1/include
(在`gcc -v'中可以查询configure项:includedir)
2. namespace是C++引入的概念,为了避免命名污染,C++用namespace来指定一些变量的可
视范围(scope),`using namespace std'是使用std标准命名空间。
3. cout是iostream中定义的一系列标准对象,`<<'则实现了cout对象的运算符重载,作用
是将字符等对象输出到标准输出对象cout。

iostream定义标准对象有:
* cout
一个ostream类的对象,用来打印数据到标准输出设备(STDOUT)
* cerr
也是ostream类的对象,将非缓冲输出数据写入到标准错误设备(STDERR)
* clog
和cerr相似,但是使用缓冲方式输出
* cin
istream,用来从标准输入设备中读取数据(STDIN)

二、numconv.cpp

//numconv.cpp---------------------
#include <iostream>
using namespace std;

int main(void)
{
int number;

cout << "please input the number : ";
cin >> number;
cout << "value in octal = 0" << oct << number << endl;
cout << "value in hex = 0x" << hex << number << endl;
}

程序从终端读取一个整数,以八进制和十六进制将其打印,展现的是重载运算符的灵活用法。
输出说明:
1. 如果输入起始字符不是整数,则打印无规则数据。(?)
2. 如果输入起始字符是整数,则一直读取到不是字符或者换行符,然后打印。

三、文件流介绍

//scopy.cpp---------------------
#include <fstream>
#include <iostream>
using namespace std;

int main(void)
{
ifstream in("Makefile");
ofstream out("output");
string s;

// don't worry about how much storage to allocate for a string
// just add things to it!
while (getline(in, s))
out << s << "\n";
}

读取文件Makefile,按行打印到文件output(一次输出一行)。
* ifstream和ostream是来自<fstream>的类,负责建立文件流对象(读和写)。
* string是C++的内建类,这里不必再去担心如何为string对象分配空间。
* getline来源于<string>。
istream& getline( istream& is, string& s, char delimiter = '\n' );
* out如同标准对象cout一样,可以使用重载运算符`<<'。

四、介绍vector

//getwords.cpp---------------------
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

int main(void)
{
vector<string> v;
ifstream in("Makefile");

// string line;
// while (getline(in, line)) // (1)
// v.push_back(line);
string word;
while (in >> word) // (2)
v.push_back(word);

for (int i = 0; i < v.size(); i++)
cout << i << ": " << v[i] << endl;
}

使用C++标准模板类vector。
1. vector是C++的标准模板类,作为C++代码可重用性的体现,STL一直是C++中变动频繁的
地方。
2. vector<string>将临近元素像数组一样存储。
vector成员赋值和添加元素都可以在O(k)中完成,查找和插入则在O(k*n)中完成。
vector支持一系列操作(cppreference.com):
  
/* vector<TYPE>:
* void assign( size_type num, const TYPE& val );
* void assign( input_iterator start, input_iterator end );
* void insert( iterator loc, size_type num, const TYPE& val );
* void push_back( const TYPE& val );
*/

没有评论:

发表评论