|
|
C++ 读书笔记 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
注://后的内容是我自己加的注释。有些内容是从《C++程序设计语言》一书中引用。 第一章 概述 名字空间(namespace)是一种将程序库名称封装起来的方法。可以避免和应用程序发生命名冲突。 变量定义的构造函数语法:int num_tries(0);//用来处理多值初始化例:complex<double> purei(0,7); c++支持3种浮点数类别,float单精度数,double双精度数,long double扩充精度数 template class机制,使程序员得以直到使用template class时才决定真正的数据型别。 在windows下以常量字符串表示文件路径时,必须以“转义序列”表示反斜线字符。 C++内建Bool类型用true/false表示真假值。 const定义的对象初始化后值不允许改变。 %取余。 Arrays(数组),Vectors(向量) array的大小必须是常量表达式。 array初始化元素间隔用“,” vector object必须含入vector头文件,定义方法: const int seq_size=18; #include <vector> vector<int> pell_seq(seq_size); 其他用法vector和array相同。 迭代(遍历,iterate) vector的初始化: 1、逐一初始化; 2、用已初始化的array作为vector的初值,vector<int> elem_seq(已初始化的数组,数组名+大小); vector知道自己的大小。elm_seq.size()表示vector的大小。 vector是一种能赋值的简单对象(The C++ Programming Language (Special Edition))。 &的多重用法。 一个未指向任何对象的指针,其内含地址为0。 指向vector<int>的指针:vector<int> *pv=0; 随机化在标准函数库cstdlib的函数rand()和srand()。 srand(大小);//参数是随机数产生的种子(seed) rand(); fstream文件操作 ofstream,如果文件不存在将产生一个文件作为输出用,如果存在则开启之做输出用,而文件中已存在的数据就会丢失。 如果不想丢弃原有内容则开启追加模式,ios_base::app 文件有可能开启失败,在写入操作前必须确定文件开启成功。 if(!outfile) // file定义的文件指针 或 if(outfile.fail()) //c++程序设计教程,钱能,清华大学出版社 控制器在iostream上执行某些操作,如:endl会插入一个换行字符,并清除输出缓冲区的内容 其他控制器:nex,oct,setprecision(n)//设定精度 文件的重新定位skeeg() 第二章 面向过程的编程风格 exit()需包含入cstdlib头文件 信任并非良好的工程原则 在函数声明中可以省略参数名称,只留函数类型。 传址(by reference)传值(by value) 调试器应用时可加上打印语句,用以追踪控制流程的逻辑并显示对象的状态。 当我们调用一个函数时,会在内存中建立起一个特殊的区域,称为“程序栈(program stack)” 引用所代表的对象不允许改变。 引用只是变量的一个别名而已。 如果在行参上加上const则函数将不能改动现参的内容。 new和delete的使用。用于堆内存heap memory的分配。 引用传值无法把默认值设为0。 当第二个参数设置为指针,并设定默认值后,在调用时可以以单一参数调用。 将调试信息输入到文件中,让cout成为默认的ostream参数:ostream & os=cout 默认参数右侧的所有参数必须也具有默认参数,否则属非法。 默认值只能指定一次,可以在函数声明处,也可在函数定义处,但不能够在两个地方都指定。 内联(inline)函数,声明为inline的函数,编译器在每个函数调用点上将函数内容展开。一般内联函数的定义常常被置于头文件中。inline函数只是一个请求。 提供重载函数(Overloaded Functions),参数表(parameter list)不同(可能时参数类型不同,也可能是参数数目不同)的两个或多个函数,可以拥有相同的函数名称。但编译器无法根据返回值类型来区别两个据有相同名称的函数。 模板函数(template functions),template<typename elemtype>关键字typename表示elemtype在函数中乃是一个临时放置型别的代称,elemtype是任意的名称。 函数的定义只能有一份,不过函数的声明倒是可以有许多份。 inline函数的定义可以多份,为了扩展inline函数的内容。 第三章 泛型编程风格 欲使用泛型算法需含入algorithm头文件 Standard Template Library (STL)主要由两种组件构成:一是容器(container)包括vector,list,set,map等类。另一种组件是用以操作这些容器类的所谓泛型算法(ganeric algorithm)包括find(),sort(),replace(),marge()等等。 vector和list是序列容器。map和set是关联容器。 所谓泛型算法,提供了许多可施行于容器类及数组型别上的操作行为。他们和他们要操作的元素型别无关。 数组做行参,仅将第一个元素的地址传入。等价于一个指向数组首地址的指针。我们可以再定义一个元素用来表示数组的终点(数组的最后一个元素的下一个地址),我们称之为“哨兵” 泛型指针(Iterators) 每个标准容器都提供一个begin()的操作函数指向第一个元素,另一个end()的操作函数指向最后一个元素的下一个位置,他们都返回一个iterator。容器提供insert()用以安插元素,提供erase()用以删除元素。 泛型的定义形式 itarator<vector,string>iter; vector<string>::iterator iter=s.begin(); 所有容器的共通操作 equality(==)和inequality(!=) assignment(=)复制 empty()容器无元素时返回true size()传送容器当前含有的元素数目 clear()删除所有元素 insert()安插函数 序列式容器deque 定义序列式容器对象的方式 1、产生空的容器: list<string>slist; vector<int>ivec; 2、产生特定大小的容器: list<int>ilist(1024); 3、产生特定大小的容器,并为每个元素指定初值: list<string>slist(16,"内容"); 4、通过一对iterators产生容器: int ia[8]={1,2,3,4,5,6,7,8}; vector<int>fib(ia,ia+8); 5、根据某个容器产生新的容器。 list<string>slist; //内容 list<string>slist2(list); 提供两个特别操作函数,允许在容器末尾进行安插和删除操作:push_bach()和pop_back()。 另外list和deque(但不包括vector)还提供push_front()以及pop_front。 this指针在meber function内用来寻址其调用者。内部运行过程是,编译器自动将this指针加到每一个member function的参数表中。由于内部代码转换,tr1.copy(tr2);将变为copy(&tr1,tr2); 在member functions内,this指针可以让我们取用其调用者的一切。 返回调用的对象只要简单的提领指针即可。return *this; 判定两个对象是否是相同,再次运用this!=&rhs即可 静态的类成员,static data members用来表示唯一一份可共享的members。他可以在同类型的所用对象中被存取。被声明为 static 的数据成员是一类特 殊的共享数据成员 无论这个类的对象被定义了多少个 静态数据成员在程序中也只有一份 //意思是,所有对象将都调用同一个类成员的内存空间。而不是单独的内存空间。 //在类中指定初值的一般方法:1、=直接赋值2、函数赋值法aa(67);3、在类的构造函数中加入:后进行上述复制。 像const static int data members,可以在声明时为他明白指定初值。 members function只有在“不存取任何non-static members”的条件下才能够被声明为static,声明方式是在声明式之前加上关键词static。 运算符重载 operator 例如: inline bool operator==(const triangular &rhs)const{return _index==rhs._index;} 运算符重载必须至少有一个参数为class类型。 引用是一种没有 指针语法的指针//C++primer3eSC //函数重载[]的实现。 //#include <cassert> // using namespace std; // int& IntArray::operator[](int index){ // assert(index>=0&&index<size); // return ia [index];} //(c++ primer3eSC的实现) 尽管C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。 在标准C++中,数组类是C++标准库的一部分,叫做向量(vector)。 vector类提供了一对begin()/*开始处*/和end()/*结束处后1个*/ 泛型算法中参数要用起始地址加上偏移量 大部分泛型算法都包含在头文件algorithm中 c++提供了一套位操作符以支持位操作,以及一个位集合(bitset)容器类型,可以用来声明含有位集合的对像。 宽字符类型wchar_t 样式:L'a' C++支持两种形式的初始化 第一种形式是使用赋值操作符的显式语 法形式 int ival = 1024; string project = "Fantasia 2000"; 在隐式形式中 初始值被放在括号中 int ival( 1024 ); string project( "Fantasia 2001" ); const对象的地址只能赋值给指向const对象的指针。但是,指向const对象的指针可以被赋以一个非const对象的地址。 引用一旦被定义就不能再指向其他对象。 特别是异常类的层次结构,它可以用来将异常进行分组,从而使一段处理代码能够只在适当的细节层级上处理错误。 一个namespace是指一个具名的范围(named scope)。namespace被用来将相关的声明划归在一起,将不相关的代码部分隔开。 C++规定:在一个特定的namespace内部,即使不做显式的限定,也默认为该namespace中所包含的对象名称是有效的。

|
|
相关文章:相关软件: |
|