`

《C++ Primer中文版》(第四版)信息汇总(二)

 
阅读更多

本章主要对语句、函数、标准IO库进行汇总。

六、语句
C++语言既有只完成单一任务的简单语句,也有作为一个单元执行的由一组语句组成的复合语句。本章主要讲解讨论C++支持的语句。

1、break语句用于结束最近的while、do while、for或switch语句,并将程序的执行权传递给紧接在被终止语句之后的语句。

2、continue语句导致最近的循环语句的当次迭代提前结束。

3、C++的异常处理包括:throw表达式、try块、由标准库定义的一组异常类。

4、使用预处理器进行调试:$ cc -DNDEBUG main.c

同时还提供了四种在调试时非常有用的常量。

view plaincopy to clipboardprint?
if(word.size()<threshold)
cerr<<"Error:"<<__FILE__ //文件名
<<":line "<<__LINE__<<endl //当前行号
<<" Compiled on"<<__DATE__ //文件被编译的日期
<<"at"<<__TIME__<<endl //文件被编译的时间
<<" Word read was"<<endl
if(word.size()<threshold)
cerr<<"Error:"<<__FILE__ //文件名
<<":line "<<__LINE__<<endl //当前行号
<<" Compiled on"<<__DATE__ //文件被编译的日期
<<"at"<<__TIME__<<endl //文件被编译的时间
<<" Word read was"<<endl

5、另一个调试技术是使用NDEBUG预处理变量以及assert预处理宏。assert宏是在cassert头文件中定义的,所有使用assert的文件都必须包含这个头文件。

view plaincopy to clipboardprint?
assert(word.size()>threshold);
assert(word.size()>threshold);

七、函数
本章节介绍函数的定义和声明,其中讨论了如何给函数传递参数以及如何从函数返回值,然后具体分析三类特殊的函数:内联函数、类成员函数和重载函数,最后讨论"函数指针"。

1、函数必须指定返回类型,没有显式指定返回类型是不合法的:

view plaincopy to clipboardprint?
test(double v1,double v2){/*....*/} //Error:没有返回值
test(double v1,double v2){/*....*/} //Error:没有返回值

2、每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参;形参的初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名。

3、非引用形参

(1) 指针形参

view plaincopy to clipboardprint?
#include <iostream>
using namespace std;
void reset(int *ip)
{
*ip=0;
ip=0;
}
int main()
{
int i=42;
int *p=&i;
cout<<"i="<<*p<<endl; //输出i=42
reset(p);
cout<<"i="<<i<<endl; //输出i=0
return 0;
}
#include <iostream>
using namespace std;
void reset(int *ip)
{
*ip=0;
ip=0;
}
int main()
{
int i=42;
int *p=&i;
cout<<"i="<<*p<<endl; //输出i=42
reset(p);
cout<<"i="<<i<<endl; //输出i=0
return 0;
}

为了保护指针指向的值,则形参需定义为指向const对象的指针

view plaincopy to clipboardprint?
void use_ptr(const int *p)
{
//user_ptr may read but not write to *p
}
void use_ptr(const int *p)
{
//user_ptr may read but not write to *p
}

(2) const形参:既可以给该函数传递const实参也可以传递非const的实参

复制实参并不是在任何情况下都适用,不适宜复制实参的情况包括:当需要在函数中修改实参的值时、当需要以大型对象作为实参传递时、当没有办法实现对象的复制时。

4、引用形参

(1) 使用引用形参可以返回额外的信息

(2) 利用const引用避免复制

5、main:处理命令行选项

view plaincopy to clipboardprint?
int main(int argc,char *argv[]){...}
int main(int argc,char *argv[]){...}

6、含有可变形参的函数

view plaincopy to clipboardprint?
void foo(parm_list,...);
void foo(...);
void foo(parm_list,...);
void foo(...);

7、千万不要返回局部对象的引用

view plaincopy to clipboardprint?
const string &manip(const string& s)
{
string ret=s;
return ret;//Error:不能返回局部对象的引用
}
const string &manip(const string& s)
{
string ret=s;
return ret;//Error:不能返回局部对象的引用
}

8、内联函数:可以避免函数调用的开销,内联函数应该在头文件中定义,这一点与其他函数不同。

view plaincopy to clipboardprint?
inline const string &shorterString(const string &s1,const string &s2)
{...}
inline const string &shorterString(const string &s1,const string &s2)
{...}

9、指向函数的指针:是指向函数而非指向对象的指针,如下pf声明为指向函数的指针。

view plaincopy to clipboardprint?
bool (*pf)(const string &,const string &);
bool (*pf)(const string &,const string &);

(1) 用typedef简化函数指针的定义

view plaincopy to clipboardprint?
//该定义表示cmpFcn是一种指向函数的指针类型的名字
//该指针类型为指向返回bool类型并带有两个const string引用形参的函数的指针
typedef bool (*cmpFcn)(const string &,const string &);
//该定义表示cmpFcn是一种指向函数的指针类型的名字
//该指针类型为指向返回bool类型并带有两个const string引用形参的函数的指针
typedef bool (*cmpFcn)(const string &,const string &);


(2) 指向函数指针的初始化和赋值

假设有函数如下,在引用函数名但又没有调用该函数时,函数名被自动解释为指向函数的指针。

view plaincopy to clipboardprint?
bool lengthCompare(const string &,const string &);
bool lengthCompare(const string &,const string &);

即可以使用函数名对函数指针做初始化或者赋值,如下

view plaincopy to clipboardprint?
cmpFcn pf1=0;
cmpFcn pf2=lengthCompare;
pf1=lengthCompare;
pf2=pf1;
cmpFcn pf1=0;
cmpFcn pf2=lengthCompare;
pf1=lengthCompare;
pf2=pf1;

(3) 通过指针调用函数:指向函数的指针可用于调用它所指向的函数,可以不需要使用解引用操作符,直接通过指针调用函数。

view plaincopy to clipboardprint?
cmpFcn pf=lengthCompare;
lenthCompare("hi","bye");
pf("hi","bye");
(*pf)("hi","bye");
cmpFcn pf=lengthCompare;
lenthCompare("hi","bye");
pf("hi","bye");
(*pf)("hi","bye");

八、标准IO库
C++的输入/输出由标准库提供,标准库定义了一族类型,支持对文件和控制窗口等设备的读写(IO),还定义了其他一些类型,使string对象能够像文件一样操作,从而使我们无需IO就能够实现数据与字符之间的转换。本章将介绍IO标准库的基础知识。

1、IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中的string对象。

2、IO对象不可复制或赋值

view plaincopy to clipboardprint?
ofstream out1,out2;
out1=out2;//Error:不能赋值操作
ofstream print(ofstream);
out2=print(out2);//Error:不能复制stream对象
ofstream out1,out2;
out1=out2;//Error:不能赋值操作
ofstream print(ofstream);
out2=print(out2);//Error:不能复制stream对象、

形参或返回类型也不能为流类型,如果需要传递或返回IO对象,则必须传递或返回指定该对象的指针或引用:

view plaincopy to clipboardprint?
ofstream &print(ofstream&);//OK:take a reference,no copy
while(print(out2)){...}//OK:pass reference to out2
ofstream &print(ofstream&);//OK:take a reference,no copy
while(print(out2)){...}//OK:pass reference to out2

3、条件状态:IO标准库管理一系列条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误。

流必须处于无错误状态,才能用于输入或输出。检测流是否可用的最简单的方法是检查其真值:view plaincopy to clipboardprint?
while(cin>>word)
//OK:read operation successful
while(cin>>word)
//OK:read operation successful

4、如果需要刷新所有输出,最好使用unitbuf操纵符,这个操作符在每次执行完写操作后都刷新流:

view plaincopy to clipboardprint?
cout<<unitbuf<<"first"<<" second"<<nounitbuf;
//等价于
cout<<"first"<<flush<<" second"<<flush;
//nounitbuf操作符将流恢复为使用正常的、由系统管理的缓冲区刷新方式
cout<<unitbuf<<"first"<<" second"<<nounitbuf;
//等价于
cout<<"first"<<flush<<" second"<<flush;
//nounitbuf操作符将流恢复为使用正常的、由系统管理的缓冲区刷新方式

5、fstream头文件定义了三种支持文件IO的类型:(1) ifstream,由istream派生而来,提供读文件的功能;(2) ofstream,由ostream派生而来,提供写文件的功能;(3) fstream,由iostream派生而来,提供读写同一个文件的功能。fstream类型除了继承下来的行为外,还定义了两个自己的新操作——open和close,以及形参为要打开的文件名的构造函数。

6、文件流对象的使用

(1) 检查文件打开是否成功

view plaincopy to clipboardprint?
ifstream infile(ifile.c_str());

if(!infile)
{
cerr<<"error:unable to open input file:"
<<ifile<<endl;
return -1;
}
ifstream infile(ifile.c_str());

if(!infile)
{
cerr<<"error:unable to open input file:"
<<ifile<<endl;
return -1;
}

(2) 将文件流与新文件重新绑定:在尝试打开新文件之前,必须先关闭当前的文件流

view plaincopy to clipboardprint?
ifstream infile("file1");
infile.close();
infile.open("file2");
ifstream infile("file1");
infile.close();
infile.open("file2");

7、文件模式:

文件模式及其含义如下表所示:

in 打开文件做读操作
out 打开文件做写操作
app 在每次写之前找到文件尾
ate 打开文件后立即将文件定位在文件尾
trunc 打开文件时清空已存在的文件流
binary 以二进制模式进行IO操作


out、trunc和app模式只能用于指定与ofstream或fstream对象关联的文件;in模式只能用于指定与ifstream或fstream对象关联的文件。所有的文件都可以用ate或binary模式打开。

8、一个打开并检查输入文件的程序:由于不清楚流in的当前状态,因此首先调用close和clear将这个流设置为有效状态,然后尝试打开给定的文件。

view plaincopy to clipboardprint?
ifstream& open_file(ifstream &in,const string &file)
{
in.close();
in.clear();
in.open(file.c_str());
return in;
}
ifstream& open_file(ifstream &in,const string &file)
{
in.close();
in.clear();
in.open(file.c_str());
return in;
}

9、字符串流

(1) istringstream,由istream派生而来,提供读string的功能

(2) ostringstream,由ostream派生而来,提供写string的功能

(3) stringstream,由iostream派生而来,提供读写string的功能

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rocket5725/archive/2009/09/18/4566753.aspx

分享到:
评论

相关推荐

    C++Primer中文版第5版.pdf

    C++Primer中文版第5版

    C++ Primer第四版【中文高清扫描版】.pdf

    《C++ Primer 第四版》是著名的C++编程语言教程,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo三位作者共同撰写。该书自出版以来,已成为广大程序员学习C++的必备书籍。第四版对前三版的内容进行了彻底的...

    C++ Primer中文版 第5版

    C++ Primer中文版 第5版_PDF电子书下载 高清 带索引书签目录_(美)stanley b. lippman(斯坦利 李普曼)(著) 王刚;杨巨峰(译)_电子工业出版社_P838_2013-09-01

    c++primer中文版第四版答案

    c++primer中文版第四版答案 缺少7,8章答案,答案比较详细

    c++primer中文版勘误表

    C++ Primer 中文版勘误表 C++ Primer 是一种广泛使用的 C++ 编程语言教程书籍,而中文版的 C++ Primer 也存在一些小错误。以下是 C++ Primer 中文版勘误表,总结了书中的一些错误和修订内容。 1. 第 79 页表 3-4 ...

    C++primer中文第五版

    《C++ Primer 中文第五版》是一本深受程序员喜爱的C++学习书籍,它全面而深入地介绍了C++编程语言的各个方面。这本书以其清晰的解释、丰富的实例和实用的建议,成为了初学者和有经验的程序员提升C++技能的重要参考...

    C++ primer中文版-高清-带目录

    《C++ Primer中文版》是一本为初学者设计的C++编程教材,旨在帮助读者深入理解和掌握C++语言。这本书的高清版本提供了清晰的文本和图表,使得阅读体验更佳,尤其适合长时间学习和查阅。目录的存在使得学习者能够快速...

    C++primer第四版源代码

    《C++ Primer》第四版是C++编程领域的一本经典教材,由Lippman, Lajoie, and Moo三位作者合著。这本书深入浅出地介绍了C++语言的基础知识、中级概念以及高级特性,旨在帮助读者掌握现代C++编程技术。源代码文件包含...

    C++ Primer中文版 第四版

    C++ Primer中文版 第四版关于c++入门的书籍。

    C++Primer习题集第五版 pdf

    习题集 【中图法分类号】TP312-44 【内容提要】 C++Primer(FifthEdition)由三位C++大师StanleyB.Lippman、JoséeLajoie和BarbaraE.Moo合作完成,其中文译本《C++Primer中文版(第5版)》也已出版。与上一版相比,本书...

    c++primer高清中文版-第5版.zip

    C++是一门强大、难学、令人痛苦,但又是如此美妙的编程语言,在工业界和学术界都可以使用,《C++ Primer(第5版)》即针对初学者,也同样适用于有一定编程经验的读者,第5版配备了C++11新标准,是C++粉丝们书架上...

    C++ Primer(中文第四版习题)

    《C++ Primer(中文第四版习题)》是一本针对C++初学者和进阶者的重要参考资料,它基于C++ Primer第四版的内容,提供了丰富的练习题以帮助读者深入理解和掌握C++编程语言的关键概念和技术。这本书是学习C++编程的...

    C++ Primer第五版 高清扫描pdf

    C++ Primer第五版 高清扫描pdf,压缩版,下载后解压即可

    C++ Primer 中文版第三版+第四版+第三版习题解答

    这里我们关注的是其中文版的第三版和第四版,以及第三版的习题解答。 1. **C++ Primer 第三版** - 第三版的内容涵盖了C++98标准,它详细讲解了C++的基础语法,包括变量、类型、操作符、控制结构、函数、数组和指针...

    c++ Primer第五版中文版 高清版 完整版

    c++ Primer第五版中文版,带书签,内容清晰容易阅读。

    C++Primer(第4版)-课后习题答案.pdf

    《C++ Primer(第4版)》是一本深入学习C++编程语言的经典教材,其课后习题答案提供了丰富的实践练习和问题解析,帮助读者巩固并深化对C++语法、概念的理解。以下将针对各章节的主要知识点进行详细阐述: 1. 第一章...

    c++primer练习答案(完整版)

    c++primer第四版练习答案完整版。

    C++ Primer中文版 (第5版)

    C++ Primer中文版 (第5版)。电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍。

Global site tag (gtag.js) - Google Analytics