1. -> 怎么用?
对于C++中的类,结构体,共用体等具有成员函数或变量的数据类型(对象)时,如果存在对象a,而对象中有成员b,那么可以使用a.b的方式,使用对应的成员。如果存在变量p,指向a, 即p = &a, 这时可以用p->b来使用成员b。即,->操作符是用于带成员的类型对应指针上,用来提取成员变量或函数用的。
p->b等同于(*p).b。对于任意的对象a,写作(&a)->b也是可以的,不过很少有这样写。
2. 控制台命令窗口结束输入
Ctrl + Z
3. 标准库的头文件用 < > 括起来,非标准库的头文件用 " " 括起来
4. 点( . )操作符仅用于类类型的对象: 左操作数必须是类类型的对象,右操作数必须指定该类型的成员
5. 缓冲区
一段用来存放数据的存储区域。IO设备常存储输入(或输出)到缓冲区,并独立于程序动作对缓冲区进行读写。输出缓冲区通常必须显示刷新以强制输出缓冲区的内容。默认情况下,读cin会刷新cout;当程序正常结束时,cout也会被刷新。
6. 对象是内存中具有类型的区域
7. 变量命名规则
包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写
8. 初始化不是复制
初始化指创建变量并给它赋初始值,赋值则是擦除对象的当前值并用新值代替
9. extern
是声明不是定义,也不分配存储空间,但是只有当其位于函数外部时,才可以有初始化式,这时可以被当作定义。任何在多个文件中使用的变量都需要有与其定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)
10. const 只读
常量对象,常量定义后不能修改,所以定义时必须初始化。在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问到。通过在定义时显式地指定const变量为extern,就可以在整个程序中访问const对象,而非const变量默认为extern。
1 // file_1.cpp 2 extern const int bufSize = fcn(); //定义时显式地声明 3 // file_2.cpp 4 extern const int bufSize; //此时可以在另一个文件中使用 5 6 // file_3.cpp 7 int bufSize = fcn(); //非const常量默认为 extern 8 // file_4.cpp 9 extern int bufSize; //此时可以在另一个文件中使用
11. 引用(&)实质是别名,const 引用是指向const 对象的引用,普通的引用绑定到const 对象是不合法的;
非const 引用只能绑定到与该引用同类型的对象,const引用可以绑定到不同但相关的类型的对象或绑定到右值;
1 const int ival = 10; 2 const int &rival1 = ival; // ok 用常引用绑定常对象 3 int &rival2 = ival; // error 用普通引用绑定常对象
12. 默认情况下:struct 的成员为public,而class 的成员为private
13. 头文件一般包含类定义、extern 变量的声明和函数证明
14. string 类型的输入操作符:
读取并忽略开头所有的空白字符(如空格,换行符,制表符);
读取字符直至再次遇到空白字符;
15. 当进行string 对象和字符串字面值混合连接操作时,+ 操作符的左右操作数必须至少有一个是string 类型的
16. vector 是同一种类型的对象的集合,是一个类模板,不是一种数据类型
1 // 初始化vector 对象的方式 2 vector<T> v1; 3 vector<T> v2(v1); 4 vector<T> v3(n,i); 5 vector<T> v4(n);
17. C++ 程序员习惯优先用 != 而不是 < 来编写循环判断条件
18. “缓冲区溢出”是对不存在的元素执行下标操作的结果
19. 任何改变vector 长度的操作都会使已存在的迭代器失效
20. 数组的维数必须用值大于等于1的常量表达式定义
1 const int a = 10; 2 double sa[a]; // ok a是 const 变量 3 4 int b = 10; 5 double sb[b]; // error 虽然b是用字面值常量初始化的,但b本身是一个非const对象,只有在运行时才能获取获得它的值,不能作为维数
21. 指针是指向某种类型对象的复合数据类型,是用于数组的迭代器:指向数组中的一个元素,指针保存的是另一个对象的地址
理解指针声明语句时,从右向左阅读
22. 在定义指针时,可用空格将符号*与其的标识符分割开来
1 string* s1, s2; // s1为指向 string类型对象的指针,s2 为string 类型的对象
23. 把指针初始为 NULL,等效于初始化为0值,NULL是在cstdlib头文件中定义的
24. 给指针赋值即可修改指针的值,不需要对指针进行解引用
1 string s("hello"); 2 string *sp = &s; // sp 指向s 3 *sp = "hi"; // 将sp指向的s 中的内容修改 4 string s1("bye"); 5 sp = &s1; // 使sp 指向s1
25. 在使用下标访问数组时,实际上是对指向数组元素的指针做下标操作,只要指针指向数组元素,就可以对它进行下标操作
1 int *p = &ia[2]; 2 int j = p[1]; // ok p[1] 相当于 ia[3] 3 int k = p[-2]; // ok p[-2] 相当于 ia[0]
26. 只要定义的多个变量具有相同的类型,就可以在for 循环的初始化语句中同时定义它们
1 const size_t arr_sz = 5; 2 int int_arr[arr_sz] = {0, 1, 2, 3, 4}; 3 for(int *pbegin = int_arr, *pend = int_arr + arr_sz;pbegin != pend; ++pbegin) 4 cout << *pbegin << " ";
27. 不能使用指向const 对象的指针修改基础对象,然而如果该指针指向的是一个非const 对象,可用其他方法修改其所指的对象
28. 指向const 对象的const指针,既不能修改指针所指向对象的值,也不允许修改指针的指向
1 const double pi = 3.14159; 2 const double *const pi_ptr = π // 从右向左阅读声明语句: pi_ptr 首先是一个const 指针,指向 double 类型的 const 对象
29. 动态分配数组及释放
只需指定类型和数组长度,不必为数组对象命名, new 表达式返回指向新分配数组的第一个元素的指针,在自由存储区中创建的数组对象是没有名字的,程序员只能通过其地址间接地访问堆中的对象
1 string *psa = new string[10]; 2 int *pia = new int[10]; 3 delete [] pia; // 必须显式地将空间释放
30. 严格地讲,C++ 没有多维数组,多维数组实际就是数组的数组;定指向数组的指针:
定义指向数组的指针:首先声明元素类型,后接(数组)变量名字和维数;
1 int ia[3][4]; 2 int (*ip)[4] = ia; 3 ip = &ia[2]; 4 // 在下面的声明中,圆括号是必不可少 5 int *ip[4]; // 指向整型的指针数组 6 int (*ip)[4];