《C++ Primer》扫盲

第二章 变量和基本类型

1. int和long的范围一致,-2147483648~2147483647,若超过int范围选用long long。

2. char在一些机器上有符号,一些机器上无符号,所以用char直接做运算,容易出错。

3. 执行浮点数运算,使用double,float精度不够,且二者计算代价相差无几,有些甚至double更快。

4. 浮点数赋值给整形变量时,不四舍五入,只保留整数部分。

    给无符号数赋值超过其范围,结果是初值对于无符号数总范围取模后的余数

    如unsigned char i = -1; // i = -1 % 256 -- 255

    给有符号数赋值超过其范围,结果是未定义的。

5. 切勿混用有符号数和无符号数,因为有符号数会自动转成无符号数

    如 int i = - 1; unsigned int j = 1; k = i*j;//4294967295

6. 字面值‘A’表示单独的字符A,字符串“A”表示一个字符数组,包括字符A和空字符(‘\0’);

    如果两个字符串字面符紧邻,且仅由空格,换行符和缩进符分隔,则为一个整体

 

    

7. 对象是具有某种数据类型的内存空间

8. 初始化不是赋值,初始化是在创建变量时给它赋予一个初始值,而赋值是把对象的当前值擦除,给一个新的值代替。

9. C++11,花括号初始化得到了全面应用 ,称为列表初始化,如int i{1};

    但若存在初始值丢失风险,如将double赋给int,编译器会报错

10. 若未被显式初始化,定义在函数之外的内置类型变量(全局变量)为0,定义在函数内部的初始值未定义,类对象由类确定。

11. 使用别处定义的变量则需要声明,如extern int j; 注意不要初始化,否则即为定义,会报错。

12.  变量命名规范:变量名用小写字符,类名开头大写,若标识符由多个单词组成,不同单词间要有区分(加下划线或大写)。

13.  嵌套作用域:如定义与全局变量同名的局部变量在其作用域内可覆盖全局变量,但不建议这样做。

14. 引用并非对象,只是为已有对象起一个新的名字,对其操作与对绑定的对象操作一致,必须初始化,且一旦定义之后,无法修改绑定对象,不能定义引用的引用以及引用的指针

      指针本身就是一个对象,允许赋值和拷贝,在生命周期内可指向不同对象,不是必须初始化注意赋值操作永远改变的是左边,例:p = &ival; 改变的是p,而*p = ival,则是改变的是*p),有指向指针的指针,以及指向指针的引用。

       int *&r = p; //r为指针的引用,从右向左的阅读r的定义,则r为一个引用,故为指针的引用

15. void*是一种特殊类型的指针,可用于存放任意类型的对象的地址,但不可对其指向的对象直接操作

16. 有关const:

       const对象一旦创建后值无法改变,所以const对象必须初始化

       如果想在多个文件共享const对象,则需在定义前加extern

       const对象的引用必须为const类型,称为常量引用,常量引用不可被用于修改其绑定的对象,但仅对可参与的操作做限定,对象仍可通过其他方式修改,即引用的对象本身可以不是常量。

       同理指向常量的指针也必须为const类型,指向常量的指针不可被用于修改其指向的对象,对象仍可通过其他方式修改,即定义为const的指针指向的对象本身可以不是常量。

        const 指针 (*const)说明指针本身是一个常量,即指向的位置不可以变,故必须初始化,能否依靠它对其指向对象进行修改与对象本身类型有关, 如:

        const double *const p = &a; // 从右向左读,第二个const表明为常量指针,第一个const表明不可用其对a修改

即:指针本身是常量不可变   char *const pContent; 

       指针所指向的内容是常量不可变   const char *pContent;      //注意*与const的位置关系

       二者均不可变  const char *const pContent;

另附const总结链接:https://blog.csdn.net/eric_jo/article/details/4138548

第三章 字符串、向量和数组

1. string的输入:cin >> s(以空白分割:空格,制表符和回车), getline(cin, s) 以回车分割

2. string的size返回为无符号数,如n为负整数,则s.size()  < n 为正,n会转成很大的无符号数

3. 

4. 范围for语句若需改变对象的值需加引用,如for(auto &c : s)

5. 若循环体内包含向vector对象添加元素的语句,则不能使用范围for语句,因为范围for语句内不应改变其循环序列的大小

6. 箭头运算符(->)把解引用和成员访问两个操作结合在一起,即it -> mem等价于(*it).mem

7. 但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素

8. 不可以用一个数组初始化另一个数组,不能用一个数组给另一个数组赋值,但vector可以

9. 关于数组的指针和引用,由数组的名字开始由里到外,从右向左读:

10. 

11. string专门提供了c_str()子函数,返回一个C风格的字符串

12. 可以使用数组来初始化vector

      如: int a[] = {1, 2, 3, 4, 5, 6}; vector<int> b(begin(a), end(a));   vector<int> c(a + 1, a + 4);

      begin和end为标准库中的函数,类似与容器的同名函数。

13. 要使用范围for语句处理多维数组,除最内层的循环外,外面都必须为引用

 

第四章 表达式

sizeof : 对char或类型为char的表达式,返回为1;对引用返回引用对象大小;对指针,返回指针大小;对解引用指针,返回指向对象大小;对数组执行,返回数组所占大小;对string或vector执行,返回固定部分大小,不计算实际元素占用空间

第五章 语句

do while语句应该在括号包围起来的条件后面用一个分号表示语句结束。

第六章 函数

1. 局部静态对象在定义时初始化,直到程序终止才被销毁,在此期间即使所在函数结束执行也不会有影响。

(可以通过不用返回值或是采用指针传递的方式修改一个值)

2.  在C++中建议使用引用类型的形参代替指针,如果无需更改引用形参的值,最好设置为常量引用形参

3.  如何让函数一次返回多个值?

    (1) 定义新的数据类型,含多个成员  (2)传入额外的引用形参

4. const:

     与其他初始化过程一样,实参初始化形参会忽略顶层const

     即void f(const int i){ } (可以传入int或const int)和 void f(int i){ }属于重复定义函数

     一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。

另附const总结链接:https://blog.csdn.net/eric_jo/article/details/4138548

5. 在含有return语句的循环外面,应该再加一条return语句

6. 同一作用域内函数名字相同,但形参列表不同,则成为重载函数(不允许只有返回值不同

猜你喜欢

转载自blog.csdn.net/qy724728631/article/details/81502903