C++ primer 简读
- C++创始人寄语:轻松使用这种语言,不要觉得必须使用所有的特性,不要在第一次学习时就试图使用所有特性。
- 头文件引用,如果是标准库引用用尖括号<>,如果是不属于标准库的头文件引用用双引号""
- 明白什么是流就知道了流的插入运算符(插入到工作台)<< cout: 输出从后面的名流向标准输出cout插入来显示.
- cin,cout,endl都是std里的标准操作。(end line)
- { } :表示实现, () : 表示声明。
- 在cpp中调用类的方法也叫调用类的成员函数(类的一个方法就是类的一个成员),点运算符表示是成员,当用点运算符调用成员时还需要调用运算符(),里面放置实参也可能为空。如sales.ISBN()
- 条件语句用括号()括起来,循环体用花括号括起来{ }
- endl的两个功能: 1结束当前行,2强制刷新缓冲到iostream流
- <<插入运算符,>>输入运算符
- &: 取地址符, *指针。 如 * p = & val,将p定义为指向val变量的指针,或者说p存放变量val的地址(这个地址就是这个对象本身)。**p:指向指针的指针
- 定义常量:const int val = 20 //定义常量val。默认const常量仅在文件内有效,若需在文件间有效,需要加前缀extern
- 迭代器解引用:(*iter), *解引用后调用方法 (*iter).empty( ), 第一个括号是解引用必须的 ,第二个括号调用成员函数必须的。
- 箭头运算符 —>:将解引用和成员访问结合起来。iter —> empty() 等价于 (*iter).empty()
- 数组的特性:在很多用到数组名字的地方,编译器都会自动将数组替换为一个指向数组首元素的指针。如 string *p = nums == p = & nums[0]
- 指针也是迭代器。*p指的是p是一个指针。可以通过给出p的下限和上限来打印所有指针。for *e = arr(10) , for(int *p = arr ; p ! = e; ++b ) cout << *p << endl; //输出arr的所有元素。
- 标准库给出了两个比较不会犯错的函数,begin()和end()。int *beg = begin(arr) //指向arr首元素的指针。int *last = end(arr) //指向尾元素的下一位置
- 如果传入print函数的是一个数组,那么实参会自动的转换成指向该数组的第一个元素的指针。
- while (beg != end) cout << *beg++ << endl; 循环内使用解引用运算符和后置递减运算符,输出当前元素并在数组内将beg向前移动一个元素。解引用操作符:*,返回指针p所指地址保存的值。这里涉及到前置++和后置++,如 j= *i++ 前置++后i本身+1且被赋值对象j也产生效果。而后置++相当于,被赋值对象j不+1,仅仅是i本身++; 等价于 j = *i,++i
- 函数重载:函数名相同,但是形参部分形式不一样。一般而言最好只重载那些确实很相似的操作,给函数起不同的名字能使得程序更易理解。
- typedef 定义别名,typedef si = sale_item (等价于typedef si sale_item) 将sale_item起一个别名si
- consexper函数:能用于常量表达式的函数。约定:1.所有返回类型及形参类型都是字面值类型 2.函数体中必须有且只有一条return语句。
- 针对封装的访问说明符:public说明符之后的成员(方法)在整个程序内可被访问,public成员定义类的接口。 private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问。private部分封装了(隐藏了)类的实现细节。类中的非公有成员如何被其他类或函数访问呢??那就是使其他类或函数称为此类的友元。
- c++标准库:io库,顺序容器,泛型算法,关联容器( map(保存的关键字和值,即key-val), set(只保存一个关键字,即只有key)),动态内存。
- 何为泛型算法??顺序容器只定义了很少的操作,如添加删除元素/访问首尾元素/确定元素是否为空/获得指向首元素或尾元素之后位置啊的指针。用户可能还需要一些其他有用的操作。如查找某元素/替换或删除一个特定值/重排元素等。标准库并没有给每个容器定都定义方法里实现这些操作,而是定义了一组通用的算法即泛型算法(可以用于不同类型的元素及不同类型的容器类型),这些算法实现了一些经典算法的公共接口。大多数算法都定义在头文件algorithm中,还有一些在头文件numeric中。一般情况下这些算法并不直接操作容器,而是遍历有两个迭代器指定的元素范围。
- C++中,堆内存通过new表达式分配,通过delete表达式释放,还定义了一个allocator类来分配动态内存块。动态内存:分配动态内存的程序同时要对其内存释放负责,新的标注库定义了智能指针shared_ptr, unique_ptr, weak_ptr来进行动态内存管理,尽可能使用智能指针来管理。
- 断点调试:几个功能:1加断点 2运行到下一行 3 进入函数体(F9,F10,F11)
- 控制台要求主函数是main(),窗口要求主函数是winmain()
- c++执行过程:首先对cpp源文件预处理(头文件完成的)(变成.ii文件),其次将.ii文件进行编译变成.S文件,机器实际能执行的是汇编,将.s文件汇编成.o文件(目标文件,二进制文件)这才算是初级的目标文件,.o文件再与C++函数库进行链接生成.exe可执行文件。而平常我们只是敲一行代码就完成这些底层了:在项目所在文件目录下,g++ -o helloworld.ii -Ehelloworld.cpp
- 计算机程序操纵的数据最终都是在内存中的,内存才是程序真正起作用的地方,而这个内存又分主存(在cpu旁边,超快)和随机访问存储器(RAM,也就是我们说的内存条)两种。
- c++中用\n换行,用\t一次四个空格。
自动存储:局部变量,函数内定义的一半变量,函数开始运行,变量加入栈中,函数运行完自动释放。
静态存储:全局变量或是static声明的变量。程序运行的整个周期存在.
自由存储:new和delete创建的,由程序员自己操纵的内存,也称堆,这个内存是独立于自动存储内存和静态存储内存外的。delete可以跨函数释放。
compile:编译当前打开文件中的代码
build/make:编译项目中所有文件,增量编译
build all:全部重新编译
debug:步进执行
一般各源文件的全局变量的访问是贯通整个项目文件的,但是当给某个源文件的全局变量加static,变为静态全局变量,那么就将其访问域限定在此源文件中,其他源文件不能调用。因此按访问权限来讲:全局变量>静态全局变量>局部变量。
当static作用于局部变量时,???
extern:声明引用的是在其他地方定义的变量。
头文件中长包含的内容:
- 函数原型
- #define或const定义的符号常量
- 结构声明_struct
- 类声明
- 模板声明
- 内联函数:内联函数可以允许同一个程序中包含同一个函数的两个定义。(程序——整个项目文件)
c++创建指针时将分配用来存储地址(这个指针)的内存,但并不会分配这个指针存放的数据的内存。
cin.getline(name,num) 读取一整行到name数组中,name数组不超i过num-1个字符。
空白符:空格,制表符,换行符。
任何两个由空白符分割的字符串拼接输出时都会直接拼接在一起,不会再有空格。
enum name{};name就成了枚举类型,类似enum用法类似typedef
sizeof():是变量的字节长度。
类是对象的描述和格式
对象是类的实体,好比类是人,对象是小明。
一行代码中不可分割的最小语义元素成称为token,如int,如main。
c++代码规范:
一:每条语句一行
二:函数后的两个花括号各占一行
三:花括号内函数实体进行缩进
四:函数名后的第一个”(“两边不含空格