8
27
2012
38

C++ Primer 4th Edition 学习笔记

      大二的Jingo需要到二校区给学弟们当C\C++程序设计实验课的TA,为了不出现各种XXOO而Jingo解决不了的事情,外加因为一直不按照C++标准去写程序,C\C++特性乱用的Jingo的确想改一下自己写代码的风格习惯,趁着前几周课程不紧,Jingo决定拜读学习一下《C++ Primer 4th Edition》。为了监督自己的学习和备忘,Jingo每天要记下一点学习笔记。

第2章 变量和基本类型

      C++的每一种变量规定了最小的存储空间;
      可以给unsigned的类型赋值为负数、超过范围的数,需要%256、65536这样的数;
      整形中,0开头比如024为八进制(octal),十六进制(hexadecimal)0x或0X开头;
      整形字面值后加L、U;
      浮点字面值后可加F、L,默认为double;  1024f是不正确的;
      转义序列\000(octal)、\xddd(hexadecimal)
      多行语句可以在行末加\链接起来;
cou/
t << en/
dl;
      标识符不能包含两个连续的下划线,也不能下划线开头后紧跟一个大写字母;
      非const引用只能绑定到与该引用同类型的对象;
      const引用能绑定到不同类型或者绑定到右值;
     
double dval=3.14;
const int &ri=dval;
      非const变量默认为extern,const默认为局部变量;
      枚举型示例:
enum Point {
    point2d = 2, point2w, point3d = 3, point3w
};   
      于是 point2d = 2,point2w = 3, point3d = 3,point3w = 4;
 
 
第3章 标准库类型
 
      cin读入string时,读到空白字符,读取终止(空白字符留在输入流中);
      getline读入时,遇到换行符终止读入并丢弃换行符;
      string::size_type,verctor<int>::size_type不要把size返回给int变量;
      string s5 = s4+","+"world";这样ok;
      string s6 = "hello"+","+s2;这样不正确;
      cctype中的isalum(c)数字或字字母之类的函数;
      vector<T> v(n) 默认初始化n个值;
      vector(a+2,a+4) 用数组初始化vector;
      C++习惯用!=;
      改变vector长度之后,不要信赖原有的迭代器;
      bitset<32> bitvec("1100") string类型倒序初始化;
      bitset<32> bitvec(str,5,4) 第5个开始4个字符;
      bitset<32> bitvec(str,str.size()-4) 只用后四位;
      site_t 在cstddef中定义的与机器相关的无符号整数;
 
第4章 数组和指针
 
      void*指针支持操作:
          与另一指针比较;
          先函数传递void*指针或从函数返回void*指针;
          给另一个void*指针赋值;
          不允许使用void*指针操纵它所指向的对象;
      cstddef中定义了ptrdiff_t这是一种与机器有关的有符号类型;
      指针指向数组某个元素后可以 k = p[-2]
      const int *p为const指针,是一个自认为指向const变量的指针;
      int *const p为指针常量,不可改变指针存储的地址;
      定义const int p = 2后,不能让一个非const指针指向p;
     
typedef string *pstring;
const pstring cstr;
pstring const cstr;
string *const cstr;
//以上三种定义形式等价
      创建动态数组并用初始值初始化int *pia = new int[10]();
      删除一个动态数组 delete [] pia;
      char *str = st2.c_str();
int ia[3][4];
int (*ip)[4];
ip = &ia[2];

typedef int int_array[4];
int_array *ip=ia;

for (int_array *p = ia; p != ia + 3; ++p)
     for (int *q = *p; q != *p + 4; ++q)
         cout << *q << endl;
     
 
第5章 表达式
 
      只在有必要时才用后置操作符;
      *iter++代表*(iter++)先使用原值解引用,再++,对比(*iter)++和*++iter;
     
int x[10];
int *p = x;
cout << sizeof(x)/sizeof(*x) << endl; //数组长度
cout << sizeof(p)/sizeof(*p) << endl; //与机器有关,返回指针大小/int大小
     
     
       dynamic_cast用于支持运行时识别指针或引用所指向的对象,目前用途不太明确,mark一下;
     const_cast转换const状态;
     int a = static_cast<int>(b);
     reinterpret_cast将操作数内容解释为另一种不同的类型;
 
第6章 语句
 
       悬垂else;
     异常处理代码中,try\throw\catch的使用先mark一下
     预处理宏,assert()是一个宏,现代C++程序很少使用预处理宏。
 
 
第7章 函数
 
       尽量用const引用不被修改的形参;
     f(int (&arr)[10])传递数组的引用,数组元素个数确定。
     f(int (*matrix)[10]) 与 f(int matrix[][10])等价;
 
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
     for (int i = 0; i != argc; ++i) {
          cout << argv[i] << endl;
     }
     return 0;
}
    
     varargs的用法,先Mark;
 

 

Category: Programming Language | Tags: c++

| Theme: Aeros 2.0 by TheBuckmaker.com