C++学习笔记&感想

  • 格式:doc
  • 大小:280.50 KB
  • 文档页数:11

C++学习笔记&感想27th-Dec一些感想:C Primer Plus的Approach & Goals上面说要“see what happens when you do the wrong thing”。

师父也曾说过类似的话,看来有时候“犯错也是一种美”,要学会犯错误。

5th-Jan一个问题:C++ Primer里的问题7.2.1有这样的函数定义:bool look_up( int *, int );double calc( double );int count( const string &, char );Date& calendar( const char* );void sum( vector<int>&, int );与7.3有这样的函数定义:void ptrswap( int *&v1, int *&v2 ) {int *tmp = v2;v2 = v1;v1 = tmp;}如下声明int *&v1;应该从右向左读v1是一个引用它引用一个指针指针指向int型的对象用函数main()操纵函数rswap()我们可以如下修改代码以便交换两个指针值。

可能上面的为一些示范。

其中的定义要注意,int *v1的“*”或“&”号为类型标识号,证明了这个类型的属性为“指针”或“引用”,而使用时,“*”与“&”变成了解引用与取地址等其它功效,是完全不同的,要注意。

6th-Jan新的知识:有关函数模板,很有用的样子。

先来一个例子,下面的函数模板的定义:template <class Type>Type min ( Type a, Type b ) {return a < b ? a : b;}int main() {// ok: int min( int, int );min( 10, 20 );// ok: double min( double, double );min( 10.0, 20.0 );return 0;}这个就是一个函数模板的应用,定义的是求最小值的函数模板。

关键字template总是放在模板的定义与声明的最前面关键字后面是用逗号分隔的模板参数表(template parameter list)它用尖括号< >一个小于号和一个大于号括起来该列表是模板参数表不能为空模板参数可以是一个模板类型参数(template type parameter)它代表了一种类型也可以是一个模板非类型参数(template nontype parameter)它代表了一个常量表达式模板类型参数由关键字class或typename后加一个标识符构成在函数的模板参数表中这两个关键字的意义相同它们表示后面的参数名代表一个潜在的内置或用户定义的类型模板参数名由程序员选择在本例中我们用Type来命名min()的模板参数但实际上可以是任何名字譬如:template <class Glorp>Glorp min( Glorp a, Glorp b ) {return a < b ? a : b;}当模板被实例化时实际的内置或用户定义类型将替换模板的类型参数类型int double char* vector<int>或list<double>*都是有效的模板实参类型。

函数定义或声明跟在模板参数表后除了模板参数是类型指示符或常量值外函数模板的定义看起来与非模板函数的定义相同我们来看一个例子:template <class Type, int size>Type min( const Type (&r_array)[size] ){/* 找到数组中元素最小值的参数化函数*/Type min_val = r_array[0];for ( int i = 1; i < size; ++i )if ( r_array[i] < min_val )min_val = r_array[i];return min_val;}10th-Jan一个很久就想澄清的知识:字符串的问题。

一种字符串的表示法是遵循以前C的表示法,用一个字符数组表示一个字符串,可以这样声明:char name[40];scanf(“%s”, name);printf(“Hello, %s. %s\n”, name, name);这是一种方法,直接读入即可,可以用strlen()函数返回一个字符串的长度,例:prinf(“%d”, strlen(name));一个很久就想澄清的知识:输入、输出的问题。

输入scanf的问题,这是个很严重的问题啊,以前还不会,现在要记住了:当读入数字的时候要加取地址&,因为这是进行指针的操作,而读入字符串数组的时候就不用了!!!当输出的时候,中间加空格的话,如果是字符会忽略中间所有间格符,但是如果是字符%c的话,情况就不同了,它严格的读入下一个字符。

如果就是读入字符串的话,它会忽略所有前导的空格,直到字符出现,然后一直读入,直到再次出现空格为止。

如果在scanf中加些其它的字符也是可以的,例:scanf(“%d,%d”, &n, &m);这个说明你要读入两个整数,中间有一个逗号间隔,它会先读入一个整数,然后忽略一个逗号,然后再读入一个整数,中间有多余的空格没关系!因为scanf会自动忽略所有空格(除%c)所以:scanf(“%d%d”, &n, &m);和scanf(“%d %d”, &n, &m);没有任何区别!要注意!而且有关%c的读入也有说法,如果加入一个前导的空格则会读入第一个非空格的字符,如:scanf(“%c”, &ch)读入的是第一个字符,无论它是什么;而scanf(“%c”, &ch)则读入的是第一个非空的字符,要注意这一点!注意scanf的返回值,如果它读入成功的话,返回读入数据的个数;读入失败的话,返回0;如果读到文件结束了,则返回EOF,这是由#define定义的,一般为-1。

注意如果使用scanf的时候,在%号与标识符中间加一*号,则代表忽略这个读入的变量,例如:scanf(“%*d %*d %d”, &n);输出:2004 2005 2006则仅读入:2006即n的值为2006。

还有要注意printf的一些场宽的东西,很有用的。

其它有关字符输入、输出的函数。

这里首先有getchar()和putchar()两个函数可以用作输入、输出单个字符,getchar()为一函数,返回值为第一个读一以字符;putchar(char ch)为一函数,没有返回值,作用直接就是输出ch字符。

另外还有对于文件读入一个字符的函数:getc(FILE *fp),用法与getchar()一样,只是要加上FILE指针的名字,下面是一段程序,有关文件使用和getc()的使用://file_eof.c –open a file and display it#include <cstdio>#include <cstdlib>int main() {int ch;FILE *fp;char fname[50];printf(“Enter the name of the file:”);scanf(“%s”, fname);fp = fopen(fname, “r”);if (fp == NULL) {printf(“Failed to open file. Bye\n”);exit(1);}while ((ch = getc(fp)) != EOF) putchar(ch);fclose(fp);return 0;}有关字符串的问题。

这是一个重要的问题了,首先总结一下形式,字符串用数组表示,因为数组本身就是一种指针操作,所以不需要再写指针号*了,而写*号则是一个指针,则不需要写数组了,一般有以下几种形式:1. char m1[40] = “Limit yourself to one line‟s worth.”;2. char m2[] = “If you can‟t think of anything, fake it.”;3. char *m3 = “\nEnough about me – what‟s your name?”;我偏好为第2种。

另外有种定义字符串数组的方法:char *mytal[5] = {“Adding numbers swiftly”,“Multiplying accurately”, “Stashing data”,“Following instructions to the letter”,“Understanding the C language”};注意*mytal[]这是说明这是一个数组,内含5个指针,不要理解错误。

一个很有用的读入字符串函数:gets()。

它的用法是:char *gets(char *s),你可以让它返回值,或不让它返回值,仅仅作为一个过程来用。

它会读取一行的字符串,直到行尾为止,把行尾的\n换成了字符串结束的标识\0。

另一个很用的读入字符串函数:fgets()。

它的用法是:char *fgets(char *s, int n, FILE *stream),你可以让它返回值、或不返,类似gets();但区别在于它可以控制读入的长度n,以及读入的文件stream,也可以使用标准参数stdin,意思是键盘读入。

当设置长度时,它会严格的读入n个字符,遇到\n也读入,这一点也比较有用!用scanf()来读入字符串。

它在以前也介绍过,但是这里有一些更多的认识,如果在%s前加上数字d,则表示要读入的字符的个数,如果它读到空格了还没有读完这个个数d,则自动停止,其它的一样。

它读入字符串时同样也返回读入的个数(字符串的个数)。

一些有用的字符串函数:strlen(char *s):返回字符串s的长度。

strcat(char *s1, char *s2):将字符串s2加到s1的后面,合并字符串。

strncat(char *s1, char *s2, int n):将字符串s2的前n个字符连接到s1的后面。

strcmp(char *s1, char *s2):如果两字符串相同,则返回0,否则返回相差的字典序。

strncmp(char *s1, char *s2, int n):比较两字符串的前n个字符是否相同。

strcpy(char *s1, char *s2):将s2复制到s1。