记录下自己掌握不清楚的概念和用法...

Day 1

endl:具有输出换行的效果,并刷新与设备相关联的缓冲区。
注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出错位置的错误判断。 buffer(缓冲区):输出缓冲区通常必须显式刷新以强制输出缓冲区内容。默认情况下,读cin会刷新cout;当程序正常结束时,cout也被刷新。 cerr:默认情况下,输出cerr不缓冲。通常用于不是程序正常逻辑部分的错误信息或其他输出。 clog:默认情况下,写到clog时是带缓冲的。通常用于将程序执行信息写入到日志文件中。 >>, << :都返回其做操作数,从而连续读入或输出。 while(std::cin >> x):在遇到文件结束符时停止读入。
注:Windows系统下--"Ctrl+z" Unix系统下--"Ctrl+d" 在C++中,把负数赋给unsigned对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。 通用转义字符:
\ooo:ooo表示3个八进制数字,这三个数字表示字符的数字值。
\xddd:十六进制转义字符,由一个反斜线符、一个x和一个或多个十六进制数字组成。 字符串字面值的连接:两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。 两种初始化变量的形式:
(1)直接初始化(更灵活且效率更高):int ival(1024); (2)复制初始化:int ival = 1024; 在C++中初始化不是赋值!!! 内置类型变量的初始化:在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。 C++string类型==比较:若是字符串常量比较则直接比较地址。(编译器优化:相同的常量都引用同一处内存减少内存消耗)
例:"abc" == "abc"返回true,"" == "\0" 返回false extren声明变量,已初始化的extern声明被当做定义。
约束:变量只在从其定义处开始到该声明所在的作用域结束处才可以访问。必须在使用该变量的最外层作用域里面或之前定义变量。 const对象默认为文件的局部变量,非const变量默认为extern。要使const变量能在其他文件中访问,要显式指定它为extern。 const引用:指向const对象的引用。规定将普通的引用绑定到const对象是不合法的。 非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。

Day 2

头文件用于声明而不是定义。因为头文件包含在多个原文件中,所以不应该含有变量或函数的定义。
3个例外:头文件可以定义类、值在编译时就已知的const对象和inline函数。原因是编译器需要它们的定义(不只是声明)来生成代码。 字符串字面值与string类型不是同一种类型。 getline(cin,str):返回时丢弃换行符,换行符不会存储在str中。 string::size_type类型:string.size()返回值类型是size_type。
注:不能把size的返回值赋给一个int变量,因为size_type是unsigned的,赋值过程有可能会溢出。 安全的泛型编程:
·C++程序员习惯于优先选用 != 而不是 < 来编写循环判断条件。
·调用size成员函数而不保存它返回的值是一种良好的编程习惯。 vector<int>::const_iterator //它自身的值可以改变,但不能用来改变其所指元素的值。
const vector<int>::iterator //它自身的值不能改变,但可以改变其所指元素的值。 任何改变vector长度的操作都会使已存在的迭代器失效。例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。 用unsigned值初始化bitset对象:若bitset类型长度大于unsigned对象位数,则其余高位置0;否则,超出bitset类型长度的高阶位将被丢弃。
用string对象初始化bitset对象:从string对象读入位集的顺序是从右向左。 bitset.size()返回值是size_t。 void*指针:可以保存任何类型对象的地址。仅支持几种有限的操作:
(1)与另一指针进行比较 (2)向函数传递void*指针或从函数返回void*指针 (3)给另一void*指针赋值 不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址。 允许把非const对象的地址赋给指向const对象的指针,但不能通过该指针改变它指向的非const对象的值。

Day 3

允许动态创建空数组,返回的是有效的非零指针,不能进行解引用。

string.c_str():返回的是const char*

使用数组初始化vector:vector<int> ivec(int_arr, int_arr + arr_size); //两个参数分别指数组首位置和数组末位置的后一个位置

严格说,C++中没有多维数组,通常所指的多维数组其实就是数组的数组。

除法或求模:
(1)两个数都为正数:除法(/)和求模(%)的结果也为正数(或零)。
(2)两个数都为负数:除法(/)操作的结果为正数(或零);而求模(%)操作的结果为负数(或零)。
(3)只有一个数为负数:除法 --- C++除法向零取整,即 a/b = (-a)/b = a/(-b);
求模 --- 根据公式:余数 = 被除数 - 商×除数 对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整形操作数。 移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的值。否则,操作未定义。 *iter++等效于*(iter++) (*p).func()等效于p->func() 对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。
例:int a[5]; sizeof(a)为20; 逗号表达式的结果是其最右边表达式的值。
例:输入一个整数,0结束 while(scanf("%d",&n),n); if(ia[index++] < ia[index]):C++未定义此行为,不能确定是先计算左操作数还是右操作数。 值初始化语法必须置于类型名后面,而不是变量后。
例:int *p = new int(); /*正确*/ int x(); /*错误*/ C++保证:删除0值的指针是安全的。

Day 4

switch语句:如果没有匹配的case标号(并且也没有default标号),则程序跳出switch语句。

两个case含有相同的值会报错。

若要匹配的case在default后面:default是最后执行的,只有所有的case都不匹配时才会执行,与位置无关。

在循环中定义的变量在每次循环里都要经历创建和撤销的过程。

Day 5

每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。

在C语言中,具有const形参或非const形参的函数并无区别:
例:void fcn(const int i){...} void fcn(int i){...} //两函数不能重载,会发生redefine error 如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。 非const引用形参只能与完全同类型的非const对象关联。 应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。
这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。 C++内置数学运算符表达式就是右值。
如:int x = 3,y = 4; fcn(x + y); //传入函数的实参是const 当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。 多维数组的传递:
void f(int (*matrix)[10], int rowSize); //将matrix声明为指向含有10个int型元素的数组的指针。
void f(int matrix[][10], int rowSize); //用数组语法定义多维数组。

Day 6

函数调用的实参按位置解析,默认实参只能用来替换函数调用缺少的尾部实参。

在一个文件中,只能为一个实参指定默认实参一次。通常,应在函数声明中指定默认实参,并将该声明放在合适的头文件中。
因为,如果在函数定义的形参表中提供默认是残,那么在只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的。 编译器隐式地将在类内定义的成员函数当作内联函数。 在成员函数声明的形参表后面有const:称为常量成员函数。不允许修改类的数据成员。 函数前有const,则说明函数返回值不可更改。 const对象、指向const对象的指针或引用只能用于调用其const成员函数,否则会报错。 构造函数的初始化列表(优先使用,效率较高):在冒号和花括号之间的代码称为构造函数的初始化列表。
优势:省去了临时对象的存在。在函数体内初始化相当于在构造函数当中做赋值的操作,而初始化列表是做纯粹的初始化操作。
我们都知道,C++的赋值操作是会产生临时对象的。临时对象的出现会降低程序的效率。
特殊场景:1. 类中存在const成员,那么该成员必须在初始化列表中做初始化。
2. 类中含有其它类B作为成员,而B类禁止掉赋值操作的情况下,那么对B的对象也只能通过初始化列表来实现。 构造函数重载与重复声明:
重载: int A(int &x); 和 int A(const int &x);
重复声明:int A(int x); 和 int A(const int x); (原因:非引用形参传递的只是副本,不能区分实参是否为const) 为了确定最佳匹配,编译器将实参类型到相应形参类型的转换划分等级。转换等级以降序排列如下:
(1)精确匹配(exact match)。实参与形参类型相同。
(2)通过类型提升(promotion)实现的匹配。
(3)通过标准转换(standard conversion)实现的匹配。
(4)通过类类型转换(class-type conversion)实现的匹配。 对于任意整形的实参值,int型优于short型匹配,即使short型的匹配较佳。 bool (*pf)(const string&, const string&); //声明一个指向函数的指针pf
bool *pf(const string&, const string&); //声明一个函数pf(...),返回值为bool* 函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。 允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数。

  

[C/C++] C++ Primer学习笔记的更多相关文章

  1. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  2. C++ Primer学习笔记(二)

    题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接  C++ Primer学习笔记(一)   27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...

  3. C++ Primer学习笔记(一)

    始终对C++念念不忘,看过 一个32岁入门的70后程序员给我的启示  之后,心情激荡,更是一发不可收拾. 认真地说,我不是一个执着的人,见异思迁,好读书而不求甚解,兼之情绪化(~~ 某些方面),于是怒 ...

  4. C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型

    一.string    #include <string>  using std::string    初始化函数:    string s1;        默认构造函数 s1 为空串 ...

  5. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  6. C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)

    STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...

  7. C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】

    STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...

  8. C++Primer学习笔记(1)

    序: 为了重新扎扎实实地再深入学习一遍C++,我选择了C++ Primer这本经典.又开了这个系列的随笔,用于记录学习过程中遇到的一些有趣的问题和心得.同时,也是想通过写随笔的方式督促自己不断进步,争 ...

  9. C++ Primer学习笔记二

    vector<int> a(10,0); for(vector<int>::iterator itor=a.begin();itor!=a.end();itor++) *ito ...

  10. C++ Primer学习笔记一

    /* 题目要求把字符串BRGBBGRRGBBGBBBGRRGBGRG按RGB顺序排列,空间复杂度为O(1) */#include<iostream> using namespace std ...

随机推荐

  1. 【CJOJ2433】陌上花开 CDQ分治

    [CJOJ2433]陌上花开 CDQ呲嘚秋分治 WA果然呲嘚秋分治跑得比树套树还快!!!(md理论复杂度不是一样的吗) 但树套树不知道比呲嘚秋高到哪里去辣装X用 Orz hzwer 第一维sort,第 ...

  2. JAVA基础 XML生成与解析和String包装类下 .replace方法的使用以及char和字符序列的使用场景

    ptLink0.setText(arbu.getPtLink().replace("&","&")); // 如果像 '&','& ...

  3. django套用模板404报错小结

    首先,我的项目名是MyProject.每次当我运行,然后测试页面的时候,总是弹出 其实根据stackoverflow上某大佬的解释大意就是在setting.py和urls.py的匹配上出了问题 此处放 ...

  4. VMware Workstation and Device/Credential Guard are not compatible

    VMware Workstation and Device/Credential Guard are not compatible. VMware Workstation can be run aft ...

  5. 模块化开发之butterknife 在 library中使用

    在Android开发中butterknife是一个很好的对资源初始化的工具,它可以使你的代码简洁通俗易懂,同时配合Android ButterKnife Zelezny插件可以让你写代码的速度提升至少 ...

  6. Unity在OpenGL模式下Shader编译报错

    报错信息 GLSL compilation failed: 0(21) : error C7528: OpenGL reserves names containing '__' 双击报错VS自动打开V ...

  7. jmeter线程组介绍

    Jmeter中的测试计划是一直有的,但可以在右侧修改名字,要开始做具体测试设计前,都需要在测试计划下边添加一个线程组,添加路径为鼠标捕获测试计划后,点击鼠标右键->添加->Threads( ...

  8. 小强版之无码理解C语言指针

     1. 先从普通变量开始   2. 撸完变量撸指针   3. 故事情节进一步发展,此处少儿不宜   4. 奶茶妹妹捉奸,小强死定了   5. 源码欣赏  #include <stdio.h> ...

  9. python-GUI之tkinter的学习

    最近看了哔哩哔哩的python的学习,直接看代码吧,以后会更新 先来个基础的 import tkinter as tk #导入包 app = tk.Tk() #抽象出一个GUI app.title(& ...

  10. layui数据表格使用(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

    表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...