C++再学习之路(一)

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;     // 从右向左阅读声明语句: 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];

 

原文地址:https://www.cnblogs.com/zhp218/p/8526539.html