本文共 2674 字,大约阅读时间需要 8 分钟。
第八章 测试和调试
1、将输入数据存放在一个文件中并使用输入重定向来为程序提供输入?????????P230,p233输出重定向
2、批处理文件——是DOS操作系统下的特性,并不是C++的特性。
3、调试器的使用!
通常使用三个命令:“执行到指定行”、“执行到下一行”(将执行当前行并停在下一行)、“查看变量”。
4、单步执行(single step)的两种方式:step into(单步进入)和step over(单步通过)。Step over总是使程序执行到下一行语句,而step into命令当程序执行遇到函数调用时,则进入该函数。
5、设置断点!
第九章 向量和数组
1、定义向量变量:( 头文件#include<vector> )
vector<type_name> variable_name(initial_size);
★注:如果向量在定义时没有指定大小,则为空,并且不能存放任何元素。
2、//将平行向量转换为对象向量;
如果发现使用两个大小相同的向量,应该考虑是否可以将它们用某个类类型的向量来替换。
Eg:
vector <string> name;
vector <double> salary;
换成:
vector <Employee> staff;
3、数组要通过一个变量来维护实际的大小;而向量则通过函数自动地维护大小。
4、数组大小一旦被确定,就不能再被改变;
5、无论以哪种方式修改向量,都要用引用方式传递向量(vector <double> & v);
6、函数可以返回一个向量,这对于计算结果为多个相同类型值组成的函数来说是很有用的;
7、当一个函数使用数组作为参数时,应该在该参数后放一个空[]运算符。
double maximum(double a[],int a_size);
8、数组参数总是通过引用方式传递,在定义数组参数时不需要使用&引用运算符。
★如果不希望函数改变数组参数中的值,则应该在数组参数前面加上const关键字:
double maximum(const double a[],int a_size)
★虽然数组可以作为函数参数传递,但是数组不能作为函数的返回类型。
★上述参数传递方式,很容易给人造成一种把整个数组传递给该函数的错觉。实际上,函数接收的只是数组第一个元素的地址。
★函数还必须知道数组何时结束,上面函数中a_size指定了数组的大小。
9、double maximum(const double a[],int a_size)
double maximum(const double *a,int a_size)
在遍历数组时,若是a[],则用下标控制;若是*a,则可以直接使用增量语句“P++”(虽然效率高,但是代码难懂,不推荐!)。
10、通常情况下,最好避免使用字符数组,而应该使用更加安全也更加方便的string类。
★在某些情况下,仍需要将string类型变量转换为字符数组,因为需要调用一个在string类出现以前编写的函数。这时,可以使用string类的c_str成员函数。
Eg;
在#include<cstdlib>中,有一个很有用的函数,该函数将字符数组中存储的数字串转换成相应的整数:int atoi (const char s[])。
所以,
string year=“1991”;
int y = atoi(year.c_str); //现在y是整数1991
11、当将二维数组作为函数参数传给函数时,必须将数组列数作为常量来指定,但是行数却可以是变量。
void print_table(const double table[][BALANCES_COLS],int table_rows){ }
(const int BALANCES_COLS=6)
8、最好不要使用char*指针,它本身也不是基本字符数组处理所必须的。
第十章 指针
1、C++中,*运算符表示指针指向的值。
Eg;
Employee* boss;
boss是Employee*类型的变量,*boss则表示一个Employee值。指针变量boss只是存储员工对象的内存地址;如果要访问这个员工对象,则应使用*boss。
2、获得指针所指的值的操作——递引用。
string name = (*boss).get_name;((.)运算符的优先级高于(*)运算符!)
string name = boss -> get_name;((->)运算符,是C++为“递引用并访问数据成员”操作专门提供的!)
3、每个成员函数都有一个特殊的参数——this指针,它指向一个隐式参数。
4、
在上例中this是指针,而b是对象。因此,访问隐式参数的price数据成员要使用this->price,而访问显示参数要使用b.price。
使用this指针可以明确说明price是数据成员而不是普通变量!
5、
6、Employee* boss = new Employee(......);
Employee boss(...);的区别!!!!!!!!!!!!
7、
8、在使用引用参数(&)时,编译程序自动地将该参数的地址传递给函数,并在函数体内“递引用”该指针参数。因此,对于程序员来说,引用比显示的指针更方便。
9、int a[10];
int* p=a; //现在p指向a[0]
a + 3; //指向数组中下标为3 的元素
//指向数组的指针支持指针运算,可以通过指针变量加整形偏移量来使其指向数组中的其他元素。
10、
11、p304,p305
(1)字符数组和字符指针又有什么区别呢?
首先在内存的中位置不同,字符数组保存的字符串存放在内存的栈中,而字符指针指向的字符串保存在内存的静态存储区中。
其次字符数组保存的字符串属于字符串变量,可以被修改,而字符指针指向的字符串是属于字符串常量,不能被修改。
(2)字符指针是不是和字符数组名都是指针常量呢?
不是,字符指针,可以改变它的指向,也就是可以为左值。可以将一个字符指针指向一个字符串常量后又指向另外一个字符串常量。字符指针在为初始化之前,他是一个未定义的值,将指向任何可能的地方,所以在使用字符指针时一定要注意初始化。
例:char* p = “Harry”;
Char s[] = “Harry”;
12、
总之,使用字符数组和指针来操作字符串不仅麻烦而且容易出错。而string类可以安全方便地操作字符串。