chapter01
-
cerr
标准错误,用于输出警告和错误信息
-
clog
输出运行时一般性信息
-
读取数量不定数据
1 2 3 4
while(std::cin>>variable) { //code }
判断的是std::cin对象的状态,输入遇到文件结束符时(end of file)或者无效输入,条件为假。
Windows输入文件结束符:ctrl+z,再按enter或者return
Unix输入文件结束符:ctrl+d
-
for循环顺序
1 2 3 4 5
for(1; 2; 4) { 3 } //重复2、3、4
-
转义序列
1 2 3 4
'\12' //换行符,八进制数 '\x4d' //字母M,十六进制数 //转义序列搭配八进制和十六进制,无十进制
chapter02
-
c++11新增long long类型
1
long long //长整形,64bit
-
选择类型
- 明知数值不可能为负数,选用无符号
- 整数运算一般选int,超过范围用long long
- 算术表达式不要使用char或者bool
- 浮点型选double,与float速度其实无差别
-
给带符号类型赋值超出范围
结果是未定义的
1
signed char c = 256;//假设char占8bit,c的值是未定义的
-
字面值常量
1 2 3
42; 'a'; "Hello World!";
-
初始化与赋值
两者不一样,初始化是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,用新值代替
定义在任何函数体之外的变量初始化为0,在函数体内需自行初始化,否则变量的值就是未定义的, 推荐所有变量应当初始化
-
变量声明与定义
1 2
extern int i; //声明 int j; //声明并定义
变量能且并且只能被定义一次,但是可以被多次声明
-
作用域
1 2 3 4 5 6 7
int var = 42; //全局变量 int main() { int var = 0; //重新定义,覆盖 std::cout<<var<<endl;//输出0 std::cout<<::var<<endl;//输出42 }
-
指针
&取地址符,*解引用符
1 2 3 4 5 6 7 8
int *p1 = nullptr; //等价于int *p1 = 0,c++11新标准 int *p2 = 0; //直接初始化p2为字面常量0 //需先#include<cstdlib> int *p3 = NULL; //等价于int *p3 = 0,使用预处理变量赋值,在cstdlib中有定义,值为0 //尽量使用nullptr,避免使用NULL //建议初始化所有指针
void* 指针可以存放任意对象的地址,但c++11不建议使用
不能和别的指针作比较、作为函数的输入或者输出
1 2 3
int* p; //合法但是容易误导,不建议使用 int* p1, p2; //误导,p1为 int*, p2为int int *p1, *p2;
-
const
1 2 3
const int i = get_size(); //正确,运行时初始化 const int j = 0; //正确,编译时初始化 const int k; //错误
默认状态下,const对象仅在文件内有效
文件共享const对象方法
1 2 3 4
//file1.cc定义并初始化 extern const int var = fcn(); //file1.h extern const int var;//与file.cc中定义的var为同一个
-
常量表达式
值不会改变、编译过程就得到计算结果的
1 2 3 4 5 6 7 8 9 10 11 12
const int var1 = 20; //var1是常量表达式 const int var2 = var1 + 1;//var2是常量表达式 int var3 = 10; //var2不是常量表达式 const int var4 = get_size();//var4不是常量表达式 //采用constexpr验证是否为常量表达式,c++11新增 constexpr int var5 = 9; //是 constexpr int var6 = var5 + 1; //是 constexpr int var7 = get_size();//除非get_size()为一个constexpr函数,否则此语句不正确 //所以认定变量为常量表达式,建议采用constexpr //const修饰的是类型,constexpr修饰的是用来算出值的那段代码--轮子哥
-
类型别名
1 2 3 4 5 6
//方法一 typedef double wages; //wages与double同义 typedef wages base, *p; //base与double同义, p与double*同义 //方法二(c++11新标准) using SI = Scales_item;//SI与Scales_item同义
-
auto
auto定义变量必须初始化
1 2
int i = 0, &r = i; auto a = r;//a为整数,r为别名
-
decltype
返回操作数的类型,可以推断表达式返回类型但不用该表达式的值初始化变量
1 2 3
decltype(f()) sum = x; //sum的类型为函数f返回值的类型 const int ci = 0; decltype(ci) x = 0; //x类型就是const int
-
头文件预处理
头文件通常包含只能被定义一次的实体,如类、const和constexpr变量
头文件一旦改变,相关源文文件必须重新编译以获取更新过的声明
1 2 3 4
#ifndef HEAD_NAME_H #define HEAD_NAME_H //防止重复包含 #endif
chapter03
-
命名空间
1 2 3 4
using namespace namepace_name;//如 using namespace std; using namespace_name::funciton(object); //如 using std::cin;
头文件不应该使用using声明,可能会引起命名冲突
-
getline()
读取一整行,连同换行符也会读取进来,但是换行符不会存到string对象,如果一开始输入就是换行符,那么得到的就是一个空的string对象
-
size()
一般返回的是usigned类型,一个表达式中如果有size()函数,就不使用int
-
由于某些历史原因和为了与c兼容,c++中的字符串字面值并不是标准库中的string对象。字符串字面值与string是不同类型
-
使用cname形式头文件代替name.h形式头文件
-
新标准for循环
1 2 3 4 5 6 7
//语法形式 for(declaration : expression) statement //例 string str("some string"); for(auto c : str) std::cout<<c<<std::endl;
-
vector
1 2 3 4 5 6 7 8 9
vector<string> s1{"a", "b", "c"}; //正确 vector<string> s2("a", "b", "c"); //错误 vector<int> ivec(10, -1); //10个int元素,都为-1 vector<string> svec(10, "hi!"); //10个string元素,都为"hi!" //默认初始化 vector<int> ivec(10); //10个int元素都为0 vector<int> ivec{10}; //1个int元素,值为10 vector<string> svec(10); //10个空的string对象 vector<string> svec{10}; //10个空的string对象
-
迭代器
如果容器为空,则begin和end返回同一个迭代器,都是尾后迭代器
本文由芒果浩明发布,转载请注明来源。 本文链接:https://blog.mangoeffect.net/cpp/reading-notes-of-cpp-primer.html