C++学习笔记
String的size操作返回的是string::size_type类型的值。
Vector的size()返回相应的vector类定义的size_type的值。使用size_type类型时,必须指出该类型是在哪里定义的:vector
两个指针做减法操作:ptrdiff_t n = ip2 – ip; //结果为标准库类型的ptrdiff_t类型
第一章 快速入门
C++中必须有一个命名为main的函数(返回值类型必须是int型),操作系统通过main函数的返回值来确定程序是否执行成功。
GUN编译器的默认命令是g++ 如:g++ prog1.cc –o prog1
endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer),通过刷新缓存区,用户可以立即看到写入到流中的输出。 std::cout ::为作用域操作符,表示使用的是定义在命名空间std中的cout。 如果不能保证读取变量之前重置变量,就应该初始化变量。 C++注释采用/**/,注释不能嵌套。 While语句,for语句, if语句
标准库的头文件用尖括号<>括起来,非标准库的头文件用双引号””括起来。
成员函数是由类定义的函数,有时候称为类方法。当调用成员函数时,通常指定函数要操作的对象,语法是使用点操作符(.)。
编译能查出的普遍错误:语法错误,类型错误,声明错误。 第二章 变量和基本类型
C++算术类型:bool char wchar_t short int long float double long double
两个相邻的仅由空格,制表符,或换行符分开的字符串字面值可连接成一个新的字符串。 初始化:C++支持两种初始化变量的形式:复制初始化(=)和直接初始化(()),直接初始化效率更高。如: Int ival(1024); int ival = 1024; 初始化不是赋值,初始化指创建变量并给它赋初始值,而赋值是擦除对象的当前值并用新的值代替。
String 定义在std命名空间中。定义如何进行初始化的成员函数称为构造函数。String类定义了几个构造函数,所以我们可以使用不同的方式初始化对象,如: #include
/*必须包含头文件*/ #include
string str1 = \ string str2(\
string str3(10, '5'); //str3 = \
cout << str1 << endl;
cout << str2 < return 0; } 声明用于想程序表明变量的类型和名字,可以用extern关键字声明变量名而不定义它,extern声明不是定义,也不是分配存储空间,程序中变量可以多次声明,但只能定义一次。只有定义才分配存储空间,如果声明也有初始化式,那么它被当做是定义,即使有extern关键字,如:extern double pi = 3.1416; 可以使用const关键字定义一个不能修改的常量,定义时就必须初始化。 在全局作用域声明的const 变量是定义该对象的文件的局部变量,此变量只存在于那个文件中们不能被其他文件访问;通过指定const 变量为extern,就可以在整个程序中访问const对象(非const变量默认为extern)。 引用就是它绑定的对象的另一个名字,作用在引用上的所有操作都是作用在该引用绑定的对象上,通过在变量名前添加“&”符号来定义,不能定义引用类型的引用,但是可以定义任何其他类型的引用,引用必须用与该引用同类型的对象初始化。 Int ival = 1024; int &refVal = ival; //正确 int &refVal2;//错误,必须指定引用对象 int &refVal3 = 10; //错误,引用的必须是对象 refVal += 2; //将refVal指向的对象ival加2 int ii = refVal; //将refVal所指向对象的值赋给int对象 ii const引用指向const对象的引用,此时可以读取const对象的值,但是不能修改。 如:const int ival = 1024; const int &refVal = ival; //正确 int & refval1 = ival; //错误 Typedef 可以用来定义类型的同义词: typedef double wanges;此时wanges 枚举使用关键字enum定义,其后是一个可选的枚举类型名,和一个用花括号括起来,用逗号分开的枚举成员列表,如:eunm open_modes { input, output, append};input默认为0,后面的比前面的值大一。枚举成员是常量。 C++支持class和struct(从c语言继承而来)定义类类型。默认情况下,struct的成员为public,而class的成员为private。头文件用于声明而不是用于定义。 避免多重包含同义头文件:#define 指示接受一个名字并定义该名字为预处理器变量,#ifndef指示检查指定的预处理变量是否未定义,,如果预处理器变量未定义,那么跟在其后的所有指示都被处理,知道出现#endif。 第三章 标准库类型 使用getline读取整行文本,getline函数返回时丢弃换行符,换行符将不会存储在string对象中。 String操作:s.empty() s.zize() s[n]—返回s中位置为n的字符,从0开始 s1 + s2 s1 =s2 s1 == s2 != < <= > >= size操作返回的是string::size_type类型的值。不要把size的返回值赋给一个int变量。 当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。 下标操作: string s1; cin >> s1; for (string::size_type ix = 0; ix != s1.size(); ++ix) { cout << s1[ix] << endl; } String对象中字符的处理:在cctype头文件定义了各种字符操作函数,适用于string对象的字符(或其他任何char值)。其操作函数见截图--------1 cctype定义的函数.png tolower() toupper() vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。将vector称为容器是因为它可以包含其他对象,容器中的所有对象都必须是同一种类型的。使用vector的声明: #include vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型,vector类型的每一种都指定了其保存元素的类型。 几种初始化vector对象的方式:见截图2 初始化vector对象的方式.png Vector v.empty() v.size() v.push_back(t) v[n] v1 = v2 v1 == v2 != ,<, <=, >, >=。 Vector的size()返回相应的vector类定义的size_type的值。使用size_type类型时,必须指出该类型是在哪里定义的:vector Vector下标操作不添加元素,下标只能获取也存在的元素。 vector for (vector 正确操作是: vector for (vector 除了使用下标访问vector对象的元素外,标准库中还提供了使用迭代器的方法访问元素,迭代器是一种检查容器内元素并遍历元素的数据类型。 容器的iterator类型(每种容器都定义了自己的迭代器类型。如:vector End()操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。 用!=或==操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则它们相等。 for (vector 用迭代器实现为: for (vector 使用vector::iteror能改变vector中的值,每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,不能修改。 for (vector } 不要混淆const_iterator和const型的iterator对象。 Const vector 迭代器支持算术操作iter + n iter – n Vector 定义bitset时,要明确bitset含有多少位,须在尖括号里给出它的长度值,长度值必须定义为整型字面值常量或也用常量值初始化的整型const对象。 bitset<32> bitvec; //32 bit,all zero 初始化bitset对象的方法:见截图4 初始化bitset对象的方法.png bitset 当用string对象初始化bitset对象时,string对象和bitset对象之间是反向转化的: string strval(“1100”); bitset<32> bitvec4(strval); //结果bitvec4的位模式中第二和第三的位置是1,其余位置是0,如果string对象的字符数小于bitset类型的长度,则高阶位将置为0。 Bitset操作见截图:5 bitset操作.png 访问bitset对象中的位也可以使用下标操作。 数组与vector类型比较:数组的长度是固定的,数组创建之后就不能添加新的元素,指针则想迭代器一样用于遍历和检查数组中的元素。现代c++程序应尽量使用vector和迭代器类型,设计良好的程序只有在强调速度的时候才在类实现的内部使用数组和指针。