注://后的内容是我自己加的注释。有些内容是从《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中所包含的对象名称是有效的。