首页 > 编程 > C++ > 正文

C++Primer学习笔记

2019-11-08 03:10:19
字体:
来源:转载
供稿:网友


1、RegOpenKeyEx(......)打开一个指定的注册表键(比如:HKEY_CURRENT_USER),安全性设置为KEY_QUERY_VALUE2、几乎所有创建内核对象的函数都有一个允许我们指定安全属性信息的参数,相反用于创建用户对象或GDI对象的函数都没有。3、FormatMessage,可以讲消息ID转换成字符串。4、,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节,‘/0’,对用的ASCII为0,对应的字符数NULL,表示字符串结束;‘0’, 对应的ASCII码是48,48对应的十六进制数就是0x30;“0”,是字符串常量。5、两个很有用的宏:ASSERT和VERIFY。前者只在Debug下有效,后者在Debug和Release都有效。通常ASSERT用的比较多,但是需要注意两点:第一,是在条件为假时输出诊断信息;第二,由于ASSERT只在Debug版本下有效;6、输出宏和函数 ①使用TRACE,其语法类似PRintf,用于向Output窗口输出信息。该宏仅仅在程序的Debug版本中出现,在release版本中无效。②使用printf时,在Debug和Release版本下都会输出信息。③使用TRACE和printf时,既可以输出字符串,也可以输出格式化信息,如(以TRACE为例)  TRACE(_T("This is a test/n"));  TRACE(_T("This is NO.%d test/n"), cnt);④使用OutputDebugString输出字符串信息,其函数原型如下:   VOID OutputDebugString(LPCTSTR lpOutputString);          该函数在Debug和Release版本中都有效,但是只能输出字符串,如果想输出变量值,需要自己先格式化。7、CFILETIME和FILETIME内存结构一样,所以可以强制转换。8、在Watch窗口中选择一行,然后输入$err,hr,则可以让它永远显示线程的上一个错误代码和错误文本描述。9、WinError.h包含了Microsoft定义的错误代码列表。10、对于宽字符而言,其所占的内存大小为len*sizeof(TCHAR),在内存中的大小都是以字节进行计算的11、理解各个内存分配函数的用法和区别12、inet_addr函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的ip地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。13、Inet_ntoa函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。http://blog.csdn.net/cx_wzp/article/details/818017514、sizeof()---求所占的字节数(1)对于整型字符型数组(2)对于整型或字符型指针15、strlen()---字符数组或字符串所占的字节数(1)、针对字符数组(2)、针对字符指针16、scanf无法读入空格,在串中遇到空格时,结束字符串的输入,所以如果用户输入"abcd  efg"的话,scanf取得的字符串为"abcd"。17、sizeof计算的结果包含结束符/0,而strlen计算的结果不包含结束符/0(其ASCII值就是0)18、字符串的操作都是以/0作为结束符的,没有遇到/0则对字符串的操作不会结束。19、拼接字符串常量:任何两个由空白(空格、制表符/t、换行符)分隔的字符串常量都将自动拼接成一个;注意:拼接时不会再被连接的字符串之间添加空格,第二个字符串紧跟着第一个字符串的最后一个字符(不考虑/0)。20、cin,sprintf等实用空白(空格、制表符、换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时,只读取空格前的一个字符串(ni hao,只读取到了ni,而hao继续留在输入队列中等待下次读取);21、istream中类(如cin)提供了面向行而不是单词的方法:getline(此函数每次读取一行,通过换行符来确定行尾,但是不保留换行符,而是回车产生的换行符直接用结束符/0替代)和get(方法类似,但是它将换行符保留在输入队列中,下次再调用的时候读取的将是换行符直接读完不能跨越,所以需要多调用一次不带参数的get(),它可读取下一个字符即使是换行符,如:cin.get(buf,size);cin.get();//读取残留在输入队列中的换行符,这样才不会影响下次的get调用cin.get(buf,size))。int year;(cin>>year).get();//将留在输入队列中的回车键取出一面下一次调用读取的时候,读取到回车键还以为是空字符22、get和getline返回的都是cin对象,随意可以cin.get(buf,size).get();cin.getline(buf,size).getline(buf,size)相对于两次调用。23、当get读取空行后将设置失效位(不是getline),这意味着接下来的输入将被阻断,必须使用cin.clear()来进行恢复24、当输入的字符串可能比分配的空间长。则get()/getline()将把剩余的字符留在输入队列中,而getline还会设置位置失效位,并关闭后面的输入。25、对于匿名的共用体(union),没有名称,其成员将成为位于相同地址处的变量。而且每次只能是一个成员是当前的成员。26、 short tell[10] = {1,2,3,4,5,6,7,8,9,10}; short *p1 = tell;       //p1指向的是tell[0]的地址,tell默认指的是其第一个short元素所存储的地址 short (*p2)[10] = &tell;//&tell则表示整个数据的地址,p2是一个指向具有10个short类型的数组的指针 short sTemp = (*p2)[5]; //*p2与tell等价27、数组名被解释为数组第一个元素的地址;28、自动变量时在函数中声明的变量,在该程序执行到其所属的代码块时产生,在离开该代码块时终止;静态变量时在函数外或者使用关键字static声明的变量,始终在整个程序的周期内存在;动态内存是通过new、delete来在程序运行时动态分配的,并且是人工释放。29、标准头文件cstring包含了strlen()和其他一些与字符串相关的函数原型。30、在C++中,只有被声明为const的成员函数才能被一个const类对象调用;要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,例如char get() const; 在类体之外定义const成员函数时,还必须加上const关键字,例如:char Screen::get() const { return _screen[_cursor];}  若将成员成员函数声明为const,则该函数不允许修改类的数据成员。31、在类的声明时,要定义常量的方法有两种:第一种采用枚举;第二种采用static定义的成员变量,他是这个类的所有对象所共有的;例如:class Test{ enum{MAX = 12};//枚举定义常量 int item_[MAX]; static const int MIN = 2;//static定义常量 int data_[MIN];};32、作用域内的枚举,当在同一类中两个枚举中存在同名的时候,如下:enum egg{Small,Medium,Large};enum T_shirt{Small,Medium,Large};所以当他们处于同一作用域的时候,编译会报错,所以使用关键字struct,class来限定枚举的定义域,如下:enum class egg{Small,Medium,Large};enum class T_shirt{Small,Medium,Large};egg choice      = egg::Small;T_shirt shirt   = T_shirt::Small;这样就不会发生命名冲突了 33、在编写模板类的时候,类的实现要和类的申明放在同一个.h中   34、gethostbyname()函数将名字转换为指向hostent结构变量的指针,再将hostent结构变量的地址成员用bcopy赋值到sockaddr_in结构变量上。  35、Word v = MAKEWORD(lowByte,highByte),返回一个无符号16位整形数。  36、调用getsockopt()函数获取Socket选项,调用setsockopt()函数设置Socket选项。   37、char str[] = "chinese people";    char *p    = &str[0];    ++*p++;//此表达式等价于++(*(p++)),后++的优先级最高,地址加1,然后取当前地址中的值,然后再将值加1。变量的自增自减是修改变量的值,指针的自增自减是修改指针的指向地址。38、实际上,左值是一个存储地址,也就是一块内存存储数据所要操作的地址。而右值是一个具体的数据或者数值,也就是改内存存储的数据内容。变量是左值,可以出现在赋值语句的左边。数字字面值是右值,不能被赋值。39、printf计算参数时是按照从右向左压栈的(从右到左进行计算),例如printf("%d,%d/n",a,a++);先执行a++。40、extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。41、在const成员函数中,用mutable修饰成员变量后,就可以修改类的成员变量了。42、结构体的长度一定是最长的数据元素的整数倍。43、printf()输出16、10、8进制分别为,%x,%d,%o,%4x表示按16进制输出,补齐4位的宽度,补齐位为空格,默认右对齐,%04x表示按照16进制输出,补齐4位的宽度,补齐位为0,默认右对齐。44、静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,是不会计算在内,所以在计算一个结构体或者类的大小时,是不会把static修饰的变量所占的内存也计算进去。45、sizeof():是运算符,可以参数可以是各种类型,其计算的长度包括"/0",int f(){return 0;},sizeof(f),在编译阶段会被函数返回值的类型取代,在这里返回4;    strlen():是函数,只能用char*作为参数传入,它内部实现是一个用循环计算字符串的长度,直到"/0"为止,其计算的长度不包括"/0"。   注:以上两个方法在计算数组大小的时候,都没有将数组名看成是指针进行大小计算。46、一个空类所占的空间为1,多重继承的空类所占的空间还是1,但是如果此类是虚继承父类,则会存在虚表(虚指针),所以此类的大小就为4。   47、宏是代码处不加任何验证的简单替代(编译预处理阶段),而inline内联函数是将代码直接插插入调用,关键字inline必须和函数定义体放在一起才能使函数成为内联。 48、浅拷贝和深拷贝的区别:在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!!!                                                                                                                        


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选