1、<iostream.h> input output stream 即是输入输出流头文件
2、<cstring.h> 是字符串处理函数的头文件
3、记熟转义序列表.
4、枚举常量按常量处理,作为常量本身是有值的,按照定义时的顺序使值不断递增。即第一个值是0则第二个是1;第一个是4,第二个就是5。
5、Stdafx Standard Application Framework Extensions(标准应用程序框架的扩展)。
6、C++语言中增加引用,主要是用它作为函数的参数,使无返回值的函数具有传递数据的功能。
7、在学习C++第四章 面向对象程序设计时的收获:
(1)学习怎么定义类,怎么去声明类,这里一定要注意结尾是“}+;”。
(2) 声明对象,对象即是类的实例化 直接“类名 对象名”即可。
(3)学习类成员的保护,类成员的保护意思是:在类外部不能访问私有成员和保护成员,而只能访问公有成员。私有成员顾名思义就是它只能在类本身的方法内访问,类的对象则不能够访问私有成员,并且私有成员不能被派生类继承。保护成员虽然不能被对象访问,但可以被派生类继承。
(4)学习构造函数的定义及调用,我的理解就是声明好类,然后“类::函数名”构造函数。还有析构函数也是如此,不过又加个“~”。调用的话 直接“类名 对象名”。
(5)学习类的继承,类的继承有单继承,多继承,虚继承。
单继承就是声明一个类以后,再在声明一个类继承前者。多继承是多个类继承同一个类,但是调用的时候两个类不能调用基类中的方法。虚继承是用到关键字“virtual”可以实现调用基类中的方法。
(6)又学习为类定义内联方法 只需要在方法返回值前添加inline关键字。也可以将方法的定义放在类的声明中,则该方法自动成为内联方法。
(7)接着又学习定义静态成员数据和静态方法。静态数据成员不仅可以由对象访问,也可以由类访问。静态成员数据被对象所共有,无论定义多少了对象,内存中的静态成员只有一个。因此,一个对象修改了静态成员数据,另一个对象在访问静态成员数据时也会发生变化。。静态数据成员必须被初始化。
(8)学习定义友元类和友元函数。用“friend” 将某个类作为另一个类的友元类。则这两个类可以相互访问彼此的私有数据或方法。
(9)Const方法 利用关键字“const”对成员进行保护。
(10)对运算符重载的+运算符或++运算符的学习
8、模拟对话框在运行时,必须关掉它后才能运行其他的窗口。而非模拟对话框显示后,程序其他窗口仍能正常进行,可以响应用户输入,还可以相互切换。
9、#include <>和#include “”的区别是:<>一般指是位于标准位置的标准include文件,而“”指的是当前目录。“”告诉预处理器在当前目录查找头文件,如果没有找到,再通过为编译器指定的其他目录查找(如何指定附加的查找目录,请查看你的编译器文档),用这种形式,头文件必须有.h后缀。
10、双冒号称为作用域解析操作符,用来告诉编译器在指定的命名空间查找函数名。
11、Using语句通常会违背使用命名空间的目的,因为他会把命名空间里所有的名字混合在一起。
12、空行和大括号所在行是紧密相关代码行的标志。
13、结构体,共用体,枚举三种。结构体引用时用“.”。共用体是一个数据变量。并且只有一个,其类型由其最后一个赋值的数据成员的数据类型决定。枚举只是一个变量,结构体大括号里是结构体的成员变量,引用结构体时可以同时引用结构体全部的变量。而枚举大括号里表示的是几种可能的值,意思是说在某一时刻只能引用一个值。
14、字节问题:一个字节8位 1byte=8bit;一个字符(char)1个字节,一个 汉字(字)两个字节,一个整型(int)四个字节(机器字长位数32位),double是8个字节,float也是四个字节,double float 是8个字节。
15、换行符 :\n ;水平制表符:\t;纵向制表符:\v;退格符:\b;回车符:\r;进制符:\f;报警符(响铃):\a;反斜线:\\;疑问号:\?;
16、默认的浮点字面值常量为double类型
17、1. 左值(发音为 ell-value):左值可以出现在赋值语句的左边或右边。就是变量的地址,或者是一个代表“对象在内存中的位置”的表达式。
2. 右值(发音为 are-value):右值只能出现在赋值的右边,不能出现在赋值语句的左边。它就是变量的值。
变量名出现在赋值运算符的左边就是左值,而出现在赋值运算符右边的变量名或字面常量就是一个右值。
18、初始化赋初值和赋值是两个不同的操作
19、永远不要依赖于未定义行为
20、<string><string.h>是两个没有关系的标准库,但是<cstring>是<string.h>的升级,就如同于<iostream>等是<iostream.h>的升级一样
21、未初始化变量会引起编程问题的,尽量少用。
22、未初始化变量有时在程序运行中并且产生错误,有时则会使程序崩溃。原因是:虽然变量是未初始化变量,但是它一样有一个值。编译器把该变量放到内存中的某个位置,而把这个位置的无论哪种位模式都当成是变量初始的状态,当被解释成整型值的时候,任何模式都是合法的值---虽然这个值不可能是 程序员想要的。因为这个值合法,所以使用它也不可能会导致程序崩溃。可能的结果是导致程序错误执行或/和错误计算。
23、构造函数这个概念,每次我想用“顾名思义”的方式来理解时,总是理解不了。在此,强调记忆它的定义:就是定义如何进行初始化的成员函数称为构造函数。
24、C++区分了声明和定义,变量的定义用于为变量分配存储空间,还可以为变量指定初始值,在一个程序中,变量有且仅有一个定义。声明则用于向程序表明变量的类型和名字。程序中变量可以声明多次,但是只能定义一次。只有当声明也是定义时,声明才可以有初始化式,才可以分配存储空间。在一个大括号里面或者外面,被初始化后的变量,后面的对这个变量的定义都是错误的,同样,后面对它的初始化也是错误的。
25、用来区分名字的不同意义的上下文被称为名字的作用域。而怎么理解作用域?作用域就是程序段中的一段区域。可分为多种:即全局作用域、局部作用域、语句作用域、类作用域和命名空间作用域。怎么理解?比如定义一个函数,函数名具有全局作用域,函数体中的变量具有局部作用域。另外,名字还可以在内部作用域中重新定义。
26、不能定义引用类型的引用,但可以定义任何其他类型的引用。引用必须用与该引用类型的对象初始化。
27、引用符号“&”。
28、非const引用只能绑定到与该引用同类型的对象,但const引用可以绑定不同类型的对象,但是需要是相关类型,因为const引用是只读的。
29、不能给常量引用赋左值
30、对于枚举的认识:关键字:enum 类型名:open_mode(随意定义) {a,b,c}; 如果a=1则后面的每个枚举成员赋的值比前面的大1。如果a未初始化,则默认初始化为0;
31、什么是常量表达式:编译器在编译时就能够计算出结果的整型表达式。整型字面值常量是常量表达式。
32、在学习类的定义时:类定义中有定义数据成员,要记住普通的定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型,就相当于声明一样。类不是在定义里定义数据成员时初始化数据成员的,而是通过称为构造函数的特殊成员函数控制初始化。
33、操作称为成员函数
34、头文件是声明,但不是定义。因此 extern很重要。声明一定要用extern。在这里温习前面的内容:要记住:非const变量在文件中声明时默认为extern。要使const变量能够在其他文件中访问,那么需要指定为extern.
35、由于头文件包含在多个源文件中,所以不应该含有变量或函数的定义。也就是说对于头文件不应该含有定义这一规则,但是有三个是例外的:即:头文件可以定义类、值在编译时就已知道的const对象和inline函数.
36、标准库类型有string、vector和bitset.标准库类型更高级更抽象。
37、::操作符是作用域操作符。例如std::cin的意思是说所需要的名字在命名空间std中定义的。
38、字符串字面值和标准库中的string类型不同,编程时注意区分
39、默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数,它由不带参数的构造函数,或者为所有形参提供默认实参的构造函数定义,如果定义某个类的变量时没有提供初始化式,就会使用默认构造函数。
40、认识并接受string::size_type类型。这个类型比int型的存储空间大一倍
41、String类型虽然能够进行和字符串字面值“+”操作,但是进行操作时必须至少有一个string类型,两个字符串字面值是不能直接“+”的,并且string类型在第一个+的最前面。
42、换行符和endl是不同的。换行符就是换行的,endl则是输出换行并刷新与cout相关联的缓冲区。
43、可打印的字符是指那些可以表示的字符,空白字符则是空格、制表符、垂直制表符、回车符、换行符和进制符中的任意一种;标点符号则是除了数字、字母或(可打印的)空白字符(如空格)以外的其他可打印字符。
44、学习了,把大写字母转化成小写字母tolower().和小写字母转化成大写字母uplower();
45、C 标准库头文件命名形式为name而C++版本则命名为cname.且少了后缀.h而在name前加了c.因此看到头文件前面带c(即cname)的基本上是C++要用的头文件。通常,C++ 程序中应采用 cname 这种头文件的版本,而不采用 name.h 版本,这样,标准库中的名字在命名空间 std 中保持一致。
使用 .h 版本会给程序员带来负担,因为他们必须记得哪些标准库名字
是从 C 继承来的,而哪些是 C++ 所特有的。
46、string类型中可以直接比较字符串大小,这与数组中相比不用一个一个字符比较了,有我们查英语字典是根据的大小比较功能。直接操作即可。如s1>s2那就是字符串s1比s2大。
47、Vector是一个类模板,不是一种数据类型
48、Vector是一种类型的对象的集合,每个对象都对应一个整数索引值,因此说vector中不是仅有一个数据的,可以有很多。
49、Vector的对象输出时需要对应索引值。Vetor <int> a(10,1); cout<<a[1];就像这个例子一样吧。
50、Vector下表操作不添加元素,要向添加元素需用v.push_back().
51、所谓的“缓冲区溢出”错误就是对不存在的元素进行下表操作的结果。
52、注意const_iterator 和iterator的区别 ,不允许用const_iterator 进行赋值。
53、不要把const_iterator与const的iterator变量混淆
54、声明一个const迭代器,必须对该对象进行初始化,并且一旦初始化后就不能改变。
55、学习标准库bitset
56、指针是指向某种类型对象的复合数据类型
57、整天看到*,不知道他的真正含义,原来* 就是解引用符,意思是对其得到操作数所指变量的引用。在声明语句中,它可以用在指定类型的对象列表的任何位置。
58、&用于对象时,返回的是该对象的存储地址,只能用于左值,因为变量只有用于左值时才能取其地址。
59、以前学习是总是把指针看的很重要,但是学C++Primer时,发现作者建议尽量少用指针和数组,,现代C++程序采用vector类型和迭代器取代一般的数组、采用string类型取代C 风格字符串。
60、指针变量可以指向vector
61、避免使用未初始化的指针,如果指针未初始化,会将指针中存放的不确定值作为地址。
62、Int变量赋值给指针是非法的。但可以直接使用0或值为0的const变量。
63、NULL是预处理器变量,他不是在std命名空间中定义的。
64、Void*,表明指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
65、无法确定某个指针是否指向一个确定的对象。因为C++中,无法检测指针是否未被初始化,也无法区分一个地址是有有效地址,还是由指针所分配的存储空间中存放的不确定值的二进制位形成的。
66、Int *p1=*p2;意思是p2指向一个指针p1;
67、起始位置和超出末端位置这两个概念,超出末端位置就是一个哨兵。
68、指针是数组的迭代器。
69、我们可以用指针来修改指针多指对象的值,但是如果指针指向const对象,则不允许用指针来改变其所指const的值。
70、了解C风格字符串的概念。C风格字符串是一NULL结束的字符数组。
71、C++提供普通的关系操作符实现标准库类型string的对象的比较,这些操作符也可用于比较指向C风格字符串的指针,但效果却不很相同:实际上,此时比较的是指针上存放的地址值,而并非他们所指向的字符串。
72、在学习C++primer过程中,作者提醒。对大部分应用而言,使用标准库类型string,除了增强安全性外,效率也提高了,因此应该尽量避免使用C风格字符串。
73、学会创建动态数组。
74、C语言中使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new 和delete表达式实现相同功能。
75、数组变量通过指定类型、数组名和维数来定义。而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针。
76、我觉得我一看到const的用法就头疼;这必然是一个弱项。
77、标准库函数strlen返回的是字符串的长度,并不包含字符串结束符。而实际上字符串存储空间是包含结束符的,因此空间是 strlen()+1;
78、c_str()函数返回C风格字符串。
79、开始学习操作符。C++中操作符分为三类:一元操作符、二元操作符、三元操作符。实际上他们就是指使用一个操作符时使用几个操作数。分别为1、2、3个操作数。
80、expr1&&expr2 先执行的是expr1是否为真,如果expr1是真就再判断expr2。如果为假的话,不管expr2怎么样都不再判断了。
81、对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。
82、我差点有弄混unsigned char。它是无符号整型。
83、又在操作符这部分了解了bitset.