在学校等待考试的日子是漫长的,散漫了几天后,终于忍耐不住,随手拿了本C++ Primer中文版,就去自习室坐了一晚上,写写画画,倒也算清净。早上慵懒的醒来,打开电脑,瞅瞅NBA赛况,浏览一下博客,上午就这样过去了。记录一下昨天画的C++Primer书上的一些东西,也算是给自己待业复习的一个安慰。
1.关于const:
- const对象必须用const引用;
- const引用指向const对象的引用;
- 非const引用只能绑定到与该引用同类型的对象;
- const引用可以绑定到不同但类型相同的对象或绑定到右值;
2.设计头文件应该注意:
头文件用于声明而不是定义;如下:
- extern int ival = 10; //error initializer ,so it’s a definition
- double fica_rate; //error no extern ,so it’s a definition
- extern int val; //ok
一些const对象定义在头文件中,但必须采用常量表达式自我初始化。
头文件可以采用其他形式保存。
3.头文件的使用:
头文件常包含其他头文件; #define val //用于定义一个预处理器变量
避免多重包含; ifndef … #define … #endif
使用自定义头文件与系统头文件的区别要注意;
4.关于标准库(string)
对string类对象进行读入时会忽略前后的空格。
string对象的定义和初始化:
- string s1;
- string s2(s1);
- string s3(“hello”);
- string s4(n,’c"); //将s4初始化为字符’c"的n个副本
用getline读取整行文本,和输入操作符不同的时,getline并不忽略开头的换行符,只要getline遇到换行符,即便他是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符那么string参数将被置为空string。
- while(getline(cin,str))
- cout << str << endl;
熟悉关于string的一些操作。在cctype头文件中定义。
- isalnum(c) 假如c是字母或数字,则为true
- isalpah(c) 假如c是字母,则为true
- iscntrl(c) 假如c是控制字符,则为true
- isdigit(c) 假如c是数字,则为true
- isgraph(c) 假如c不是空格,则为true
- islower(c) 假如c是小写字母,则为true
- isprint(c) 假如c是可打印的字符,则为true
- ispunct(c) 假如c是标点符号,则为true
- isspace(c) 假如c是空白字符,则为true
- isupper(c) 假如c是大写字母,则为true
- isxdigit(c) 假如c是十六进制数,则为true
- tolower(c) 假如c是大写字母,则返回小写字母形式,否则返回c。
- toupper(c) 假如c是小写字母,则返回大些字母形式,否则返回c。
5.关于标准库(vector)
vectror是一个类模板,个人把它理解为一个类似于数组的容器,不同的是vector可以动态增长,而且下标操作只支持已经存在的值,不能用于赋值。这是两点与数组不同的地方。
对vector操作,可以用迭代器来进行操作,迭代器分为两种,一种是普通的迭代器,另一种是只读迭代器。
定义一个int类型的迭代器,vector<int>::iterator it;
另一种只读迭代器为,const_iterator,常用来打印输出容器中的内容,不能用于修改赋值等操作。
6.关于标准库(bitset):
从字面意义上来讲,bitset就是位集,由于之前主要经历都在学习C语言编程,对于C++也只是了解机制。所以这是第一次接触bitset,让我体会到了c++这些面向对象语言的封装性。下面只列一些简单的bitset操作,详细的可以查询书籍。
定义bitset,和vector一样,bitset中的位是没有命名的,只能按照位置来访问他们,位集合的编号从0开始,因此下面的bitset序号从0到31位。
- bitset <32> bitvec; //32 bit , all zero
初始bitset的方法:
- #if 0
- bitset <n> b; //b有n位,每位都是0
- bitset <n> b(u); //b是unsigned long型的u的一个副本
- bitset <n> b(s); //b是一个string对象中的含有位串的副本
- bitset <n> b(s,pos,n); //b是s中的从位置pos开始的n个位的副本
- #endif
- /*
- *example
- */
- bitset <16> bitvec1(0xffff); //bit 0-15 are set to 1
- bitset <32> bitvec2(0xffff); //bit 0-15 are set to 1; 16-31 are set to 0
- bitset <128> bitvec3(0xffff); //bit 32-127 are set to 0
- string strval(“1100″);
- bitset bitvec4(strval); //bit 2-3 are set to 1 the other are set to 0
- string str(“11111110000001111001001″);
- bitset<32> bitvec5(str,5,4); //4 bits starting at str[5],1100
- bitset<32> bitvec6(str,str.size()-4); //use last 4 characters
相关操作:
- set()
- reset()
- to_ulong()
- …..
7.try块和异常处理:
相关头文件:stdexcept/exception
使用时的处理方法,一是采用#ifndef __DEBUG__ #endif等宏处理,二是采用assert断言不会出现等方法。
8.老生常谈的数组传参问题:
当数组作为形参时,函数操作的形参为数组首元素指针的首元素的指针的副本,所以对该指针进行操作要特别注意,不会修改实参指针的值,但可以改变指针指向的对象的值。
如果传数组的引用时,则数组类型的大小都会强制要求相同。
多维数组的传递原则:以指向0号元素的指针方式传递,即忽略第一维的长度,其他维都要求显式表示。
- int a[3][10];
- 传参时形参如下:
- void print(int (*a)[10],int size)
- 或
- void print(int a[][10],int size);
非引用数组形参的类型检查只是确保实参和数组元素具有相同类型的指针,而不会检查实参实际上是否已经指向指定实际大小的数组;
所以任何处理数组的程序都要确保形参所指向的位置在数组边界内。
处理方式如下:
- 1.数组中加标记;
- 2.传递开始和结束的指针。
- 3.显式的执行数组的大小。
9.没有返回值的函数,可以返回另一个返回类型同样是void的函数的调用结果。(page 212);
最后写一个例子,返回一个指向函数的指针。
- int (*ff(int))(int *,int)