C++ Primer学习笔记(一)

来源:互联网 发布:手机房屋装修软件 编辑:程序博客网 时间:2024/06/16 11:02
  • 微软编译器用命令cl调用编译器: C:/……>cl -GX(用命令行) prog1.cpp
  •  GUN编译器用命令g++调用编译器: $g++ prog1.cc -o prog
  • 访问main函数返回值:Unix:echo$?    windows: echo %ERRORLEVEL%
  • 从键盘输入文件结束符:windows: ctrl+z    Unix: ctrl+d
  • 只有内置类型存在literal constants,字面值常量默认类型为int、long但无short型的
  • escape sequence转义序列    concatenated string连续字符串
  • 可用八或十六进制转义字符来定义字符,如/xddd,/115('M')
  • C++操作符替代名:and,bitand,compl,not_eq,or_eq,xor_eq,and_eq,bitor,not,or,xor
  • 标识符不能包含两个连续的下划线,也不能以下划线开头后紧跟一个大写字母,函数外定义的标识符不能以下划线开头。
  • string类型至少有两个constructors:1,通过字符串字面值初始化;2,通过字符和计数器初始化
  • 如果声明有初始化式,那么它可被当做定义,即使声明标记为extern,只有当extern声明位于函数外部时,才可以有初始化式
  • 全局作用域声明的const变量是定义该对象的文件的局部变量,extern const则可在整个程序中访问。
  • 初始化是指明引用指向哪个对象的唯一方法
  • const reference is a reference to const
  • 定义不能出现在头文件中,头文件用于声明。例外:类,const对象,inline函数
  • 字符串字面值和标准库string类型不是同一类型
  • string类型输入操作符读取并忽略开头所有空白字符,再次遇到空白字符时,读取终止。getline不忽略每行开头的空白,getline返回时丢弃换行符
  • size()成员函数返回值为size_type类型,是无符号类型
  • string对象和字符串字面值混合连接操作时,+操作符的左右操作数至少有一个必须是string类型。string s5=s1+","+"world"正确,但string s6="hello"+","+s2错误
  • string[ix]中ix是size_type类型
  • 可打印字符指可以表示的字符,空白字符:空格、制表符、垂直制表符、回车符、换行符、进纸符。标点符号:除数字、字母、(可打印的)空白字符外的其他可打印字符
  • vector中下标操作并不向其中添加元素
  • vector中必须是已存在的元素才能用下标操作符进行索引
  • 对const_iterator类型解引用时,得到一个指向const对象的引用,它与const迭代器不用,声明一个const迭代器时,必须初始化迭代器,以后不能改它的值
  • vector<int>::const_iterator :an iterator that can't wirte elements;          const vector<int>::iterator : an iterator whose value can't change
  • 任何改变vector大小的操作都会使迭代器失效
  • bitset类处理二进制位集合,bitset类型对象的区别在于其长度而非类型,bitset<n> b;
  • 用string对象初始化bitset时,两者是反向转化的
  • 数组维数为常量表达式,非const变量及运行时才知的const变量不能用于定义数组的维数
  • 数组不能直接复制和赋值
  • 把int型变量赋给指针式非法的,例外:字面值常量0或const变量0,等效于NULL
  • 两指针相减结果的类型时ptrdiff_t(cstddef头文件中)
  • 不可把const对象地址赋给非const对象指针
  • 不能保证指向const的指针所指对象的值一定不可修改
  • typedef string *pstring; const pstring cstr;——>string *const cstr;
  • C++不允许定义长度为0的数组变量,但调用new动态创建长度为0的数组是合法的(此时不能解引用)
  • %只能用于整型(包括unsigned)
  • 一正一负的%、/操作的结果取决于机器(对于%,若求模结果随分子符号,则向零取整,若与分母匹配,则向负无穷取整)
  • 位运算操作数若为负,则位操作符如何处理operand符号位取决于机器
  • 移位运算有操作数不能为负,且须严格小于左操作数位数,位操作只能用于整型
  • 移位运算符优先级比算术操作符低,比关系操作符,赋值操作符,条件操作符高
  • 数组名是不可修改的左值,而下标和解引用都返回左值,可用作赋值操作符的左操作数(非const数组)
  • 自增操作优先级高于解引用
  • 解引用优先级低于点操作符
  • (*p).foo == p->foo;
  • int max = i>j?i>k?i:k:j>k?j:k   ==  int max = i; if(j>max)max = j; if(k>max) max = k;
  • cout << i <j?i:j 错误,将cout与int j比较
  • sizeof返回值类型size_t,sizeof用于表达式时,将获得结果的长度
  • 指定求值顺序的操作符:&& ,||,,,?:
  • 动态创建对象只需指定数据类型,不必为该对象命名
  • int *pi= new int;   初始化:int *pi = new int(1024);
  • 值初始化:int *pi = new int(),全初始化为0
  • delete后指针变为垂悬指针(指向曾存放对象的内存,但对象已不存在),建议删除所指对象后,指针置0
  • 任何数据类型的指针都可转化为void*类型,0可转化为任意指针类型
  • 强制类型转换:static_cast,dynamic_cast,const_cast,reinterpret_cast
  • 对于switch结构,只能在它的最后一个case标号或default标号后面定义变量或引入块语句
  • break用于结束最近的while,do while,for或switch语句,包括嵌套
  • continue只能出现在while,for,do while循环中,包括嵌套
  • 每一个标准库异常类都定义了名为what的成员函数,这个函数不需要参数,返回C风格的字符串
  • try-catch中,若无处理异常的catch子句,程序的运行就要跳转到名为terminate的标准库函数(在exception头文件中),这个标准库函数的行为依赖于系统,通常导致程序非正常退出
  • 无try-catch,异常发生时系统将自动调用terminate终止程序的执行
  • 标准库类常定义在四个头文件中:exception(只通知产生异常,不会提供更多信息),stdexcept(exception,runtime_error,range_error,overflow_error,underflow_error,logic_error,domain_error,invalid_argument,length_error,out_of_rang)new,type_info
  • assert(expr):expr为0时执行
  • assert仅用于检测确实不可能的条件,只对程序的调试有帮助,不能用来代替运行时的逻辑检查,也不能代替对程序可能产生的错误的检测
  • 执行到return语句时,函数调用结束
  • 函数不能返回另一函数或者内置数组类型,但可返回指向函数的指针或指向数组元素的指针的指针
  • 可以将指向const对象的指针初始化为指向非const对象,但不可以让指向非const对象的指针指向cosnt对象
  • 调用函数时,若该函数使用非引用的非const形参,则既可给该函数传递const实参也可传递非const实参,反之亦然
  • C语言中,具有const形参或非const形参的函数并不区别
  • 若函数具有普通的非const引用形参,则不能通过const对象进行调用,传递一个右值或需转换的类型的对象同样不允许(非const引用形参只能与完全同类型的非const对相关联)
  • compiler检查数组形参关联的实参时,不会检查数组长度(非引用情况)
  • 多维数组除了第一维以外的所有维的长度都是元素类型的一部分,必须明确指定
  • int *matrix[10]:array of 10 pointers
  • int (*matric)[10]:pointer to an array of 10 ints
  • int main(int argc,char *argv[]){}  argv第一个字符串(有的话)通常是程序的名字
  • 返回类型是void的函数可以返回另一个返回类型同样是void的函数的调用结果
  • 返回引用的函数返回一个左值,这样的函数可用于任何要求使用左值的地方
  • 主函数main不能调用自身
  • 如果在函数定义的形参表中提供默认实参,那么只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的
  • inline说明对于编译器来说只是一个建议,编译器可以忽略这个,inline函数应放在头文件中
  • 内联函数在编译时展开,避免了运行时函数调用的开销。
原创粉丝点击