参考文献(References)
[1] Stanley B.Lippman,Josee Lajoie,Barbara E.Moo.C++ Primer 中文版(第5版)[M].王刚,杨巨峰,北京:电子工业出版社,2013.9
这一学期看了《C++ Primer》。把有用的句子记了下来。今天把它们录入电脑,总结如下。
1.1: 访问main的返回值方法 $echo$? $echo %ERRORLEVEL%
1.2: iostream → istream + ostream
1.3: 调试打印语句保持一直刷新,程序崩溃会让输出保持在缓冲流中
1.4: UNIX系统中文件结束符用CTRL+D
1.5: type error
1.6: declaration error
1.7: 修正一个错误后立即调试代码
1.8: 一旦选择了一种风格,就要坚持使用
1.9: bool(ud)、char(8)、wchar_t(16)、char16_t(16)、char32_t(32)、short(16)、int(16)、long(32)、long long(64)、float(6)、double(10)、long double(10);
1.10: long long在C++11中定义
1.11: int下取整 == short long下取整==int long long下取整==long
1.12: 可寻址的最小内存块称为字节(byte)
1.13: 存储的基本单元 字(word)
1.14: 字节由8bit构成,字则由32或64比特构成,也就是4或8字节
1.15: float 1字 double 2字 long double 3~4个字 float 7有效位 double16有效位
1.16: 明确知晓数值不为负的时候,选用无符号类型
1.17: 算术表达式不要使用char或bool
1.18: 执行浮点数运算选用double
1.19: 超出符号类型范围的值:1继续工作,2崩溃,3垃圾数据
1.20: 2的32 = 4294967296
1.21: (unsigned)10+(int)(-42) = 2的32次方-32
1.22: (unsigned)10-(unsigned)42 = 2的32次方-32
1.23: (unsigned)作循环,条件>=0为死循环
1.24: --(unsigned)0 = 2的32-1
1.25: 带符号类型和无符号类型进行运算,有符号转无符号
1.26: (unsigned)10 - (int)10=0
1.27: (int)10 - (unsigned)10 = 0
1.28: 形如42的值——字面值常量
1.29: 从0开头的整数表示八进制、以0x或0X开头的代表十六进制数
1.30: int month = 09
1.31: \? \f \a
1.32: \7响铃 \12换行符 \40空格 \0空字符 \115字符M \x4d(字符M)
1.33: 字符串字面值的实际长度比它的内容多1
1.34: "\1234"→'\123'+'4'两个字符
1.35: "\x1234"表示一个16位的字符
1.36: 对象是指一块能存储数据并具有某种类型的内存空间
1.37: 练习2.10
1.38: extern int j//声明i而并非定义i
1.39: extern包含初始值就不再是声明了
1.40: 全局变量多个文件共同使用,则用extern声明即可
1.41: C++静态类型语言statically typed 类型检查 type checking
1.42: 不能连续出现两个下划线,不能以下划线紧连大写字母开头,函数体外的标识符不能以下划线开头
1.43: 变量名一般用小写字母、自定义的类名以大写开头
1.44: alignas、register、alignof、decltype、reinterpret_cast、asm、auto、typeid、typename、enum、static_cast、char16_t、explicit、noexcept、char32_t、export、nullptr、volatile、wchar_t、constexpr、thread_local、const_cast
1.45: and、bitand、compl、not_eq、or_eq、xor_eq、and_eq、bitor、not_or、xor
1.46: scope作用域
1.47: 在对象第一次被使用的地方附近定义它是一种好的选择,因为这样做有助于容易找到变量的定义
1.48: for(int i=0;i!=10;++i)执行几次?10,i = [0:9]
1.49: 复合类型compound type引用和指针
1.50: (base type)+(declarator)
1.51: 右值引用 rvalue reference 左值引用 lvalue reference
1.52: refers to global scopeblock scope
1.53: 引用必须被初始化
1.54: 引用一生只能绑定一个对象
1.55: pointer指针
1.56: 解引用符(*)\
1.57: int *p1 = nullptr,int *p2 = 0,int *p3 = NULL
1.58: void* ① 可以存放任意对象的地址 ② 和别的指针作比较 ③ 作为函数的输入和输出
1.59: int&r = 0 是错的
1.60: int *const p2 = &i2 是对的
1.61: const int &r = 0 是对的
1.62: const int *const p3 = &i2 是对的
1.63: const int *p1 = &i2
1.64: const int &const r2 是错的
1.65: const int *p 是对的
1.66: 在多个文件出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量
1.67: 添加extern在多个文件之间共享const对象
1.68: const int &r1 = ci
1.69: 指向常量的指针,常量指针,常量const
1.70: 常量表达式const expression
1.71: 在编译过程中就可以得到结果
1.72: 使用constexpr类型由编译器来验证常量表达式
1.73: 算术类型,引用和指针都属于字面值类型
1.74: 自定义类不属于
1.75: 不能定义成constexpr
1.76: int null=0,*p=null;
1.77: 类型别名(type alias)
1.78: typedef 同名化
1.79: 别名声明 alias declaration
1.80: using SI = Sales_item,同义词
1.81: SI item 指针常量和类型别名
1.82: typedef char* pstring,const pstring cstr = 0,const char *cstr = 0
1.83: 前者表示指向了char的常量指针,后者表示指向了const char的指针
1.84: auto自动分析表达式结果所属的类型
1.85: auto一行申请多个变量的时候全部要一样
1.86: decltype引入了第二种类型说明符
1.87: decltype(f())sum = x,sum的类型就是函数的返回类型,不实际计算函数的返回值
1.88: 头文件一旦改变,相关的源文件必须重新编译以获取更新过的声明
END 20150921 星期一
2.1: 头文件保护符header guard
2.2: #ifndef SALES_DATA_H …… #endif
2.3: 第一次包含时,#ifndef为真,即未包含该头文件,所以执行到#endif
2.4: 到了第二次包含时为假,所以就不导入该头文件了
2.5: 预处理变量名字全部大写
2.6: string可变长字符串 vector可边长的集合
2.7: using std::cin
2.8: string s4(10,'c')
2.9: 用等号初始化一个变量叫拷贝构造化
2.10: 用括号初始化叫做直接初始化
2.11: cin>>不读入换行符存在缓冲区
2.12: string::size_type无符号类型的字,足够存放下string对象的大小。有string.size()就不要与int作计算了,避免unsigned和int混用
2.13: 标准库的名字总能在std::中找到
2.14: cctype isalnum(c)字母数字 isalpha(c)字母 iscntrl(c)控制字符 isdigit数字 islower isprint可打印字符 ispunct标点符号 isspace空白 issupper大写字母 isxdigit十六进制数 tolower toupper
2.15: for(auto c:string)cout<<c<<endl
2.16: vector<T> v5{a,b,c,……}
2.17: vector<int> ivec(10,-1)
2.18: vector.push_back(i)
2.19: v[n]
2.20: for(auto &i:v){i*=i;}
2.21: s.begin()返回指针
2.22: begin()返回第一个元素
2.23: end()返回最后一个元素的下一个元素(空)
2.24: for(auto it = s.begin();it!=s.end() && !isspace(*it);++it)*it=toupper(*it);
2.25: begin()和end()若为const常量则返回const_iterator否则返回iterator
2.26: difference_type
2.27: 如果不清楚元素的确切个数 请使用vector
2.28: 自量常量表达式constexpr
2.29: 编译器扩展compiler extension
2.30: 由内向外 自右向左阅读
2.31: cstddef定义了size_t表示内存中任意对象的大小
2.32: int* e = arr[10]
2.33: begin(int[])
2.34: end(int[])
2.35: 两个指针相减的结果类型是ptrdiff_t
2.36: strcmp比较p1==p2 0 p1>p2+ p1<p2_strcat 将p2附加到p1之后,返回p1
2.37: strcpy将p2拷贝到p1,返回p1
2.38: strlen以'\0'空字符判断结尾
2.39: c_str()
2.40: 无法保证c_str()指向的数组一直有效
2.41: for(auto& row:ia)for(auto&col:row){}
2.42: int i = 0 , cout<<i<<' '<<++i<<endl
2.43: 逻辑与&& 逻辑或|| 条件?: 逗号,明确规定了运算对象的求值顺序
END 20150928 星期一 P123
3.1: 如果改变了某个运算对象的值,在表达式其它的地方不要再使用这个值
3.2: (-m)/n = m/(-n) = -(m/n)
3.3: m%(-n) = m%n
3.4: (-m)%n = -(m%n)
3.5: (-m)%(-n) = (-m) % n = - (m%n)
3.6: 优先使用前置版本递增运算符++i
3.7: cout<<*pbeg++<<endl
3.8: 输出*pbeg所指的元素,然后pbeg指针向右诺一格
3.9: 等价于cout<<*pbeg<<endl
3.10: ++pbeg
3.11: 前者比后者简洁且更少出错
3.12: ptr->mem (*ptr).men *iter.empty()
3.13: ++*iter,iter++→empty()
3.14: string s = "word"
3.15: string p1 = s