虽然C++作为比赛的代码已经写了很多了,但是很多细节上的东西还是存在很多不懂得地方,重新学习并记录.jpg。
cerr和clog为ostream定义的两个对象。cerr通常输出警告和错误消息,被称为标准错误。clog用来输出程序运行时的一般性信息。
程序员调试时输出打印语句,应保证一直刷新流,否则,如果程序崩溃,输出还留在缓冲区中,可能会造成对于程序崩溃位置的错误判断。
char分为3种类型 unsigned char / signed char/char
字符型有三种 但是表现形式只有两种:带符号和无符号的 具体哪种由编译器决定
选择类型的经验准则:
*明知不可能为负时,选择使用无符号类型
*超过int即选用long long
*算术表达式不要用char或bool char在一些机器有符号一些无符号,进行运算容易出问题,如果需要使用一个不大的整数,明确指定signed char或 unsigned char
*浮点数用double
赋给带符号类型一个超出的范围,结果是未定义的。
切勿混用带符号类型和无符号类型
默认情况下 十进制字面值是带符号数 尽管整数字面值可以存储在带符号数据类型中,单严格来说 十进制字面值并不可能是负数,-42 负号并不在字面值以内,负号作用仅仅是对字面值取负。
初始化和赋值是两个完全不同的操作,初始化的含义是创建变量是赋予其一个初值,而赋值的含义是把对象当前的值擦除,而以一个新值代替。
c++如果使用列表初始化且初始值存在丢失信息风险,则编译器会报错。
c++为了支持分离式编译,将声明和定义区分开来。一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。
变量声明规定变量的类型和名字,定义与之相同,但定义还会申请储存空间,也可能为变量赋一个初始值。变量声明关键字extern,任何包含显式初始化的声明即为定义。
标识符的约定俗成的规范
*体现实际含义
*一般用小写字母
*类名一般以大写字母开头 Sales_item
*多单词组成应有区分 student_loan or studentLoan
复合类型:引用 指针
定义引用时必须初始化,一般初始化变量时,初始值会拷贝到新建的对象中。但是定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始化对象一直绑定在一起。因为无法令引用重新绑定到另一个对象,因此引用必须初始化。
引用并非对象,相反只是一个已经存在的对象所起的另一个名字。
因为引用自身并非对象,所以不能定义引用的引用。
除了某些特殊情况,引用的类型必须与被绑定的对象类型完全匹配,引用只能绑定对象,不能绑定字面值或某个表达式的计算结果。
指针
指针本身就是对象,允许对指针赋值和拷贝,声明周期内可以指向不同的对象。
指针无需在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定值。
指针存放某个对象的地址 获取需使用取地址符
大多数情况下,指针的类型必须与所指定对象相同。
引用不是对象,没有实际地址,所以指针不能指向引用
对指针解引用会得出所指的对象,因此如果给解引用的结果赋值,实际上就是给指针所指的对象赋值
解引用操作只适用于那些确实指向了某个对象的有效指针
void*是一种特殊类型的指针,做的事情比较有限,拿它和别的指针比较,作为函数的输入输出,或者给另外一个void*指针赋值
int* p1,p2;//表示定义一个p1的int指针和p2的int对象
通过*的个数可以区分指针的级别,即**表示指向指针的指针
指针是对象,因此可以定义指向指针的引用
const
const对象必须初始化 初始值可以是任意复杂的表达式
const对象默认情况下被设置为仅在文件内有效 当多个文件出现相同的const变量时,等同于在不同文件中分别定义了独立的变量
解决方法是对于const变量不管是声明还是定义都添加extern关键字,这样定义一次即可。
可以把引用绑定在const对象上,称为常量引用.
常量引用允许绑定非常量对象
指针也可指向常量和非常量,指向常量的指针不能用于改变其所指对象的值,想存放常量对象的地址,只能使用指向常量的指针
const指针
常量指针必须初始化,而一旦初始化完成,它的值即地址就不能在改变了,即不变的是指针而不是它所指向的值
顶层const
如前所述,指针本身是一个对象,因此指针本身是不是常量以及指针所指的对象是不是常量是两个问题,顶层const表示指针本身是常量,底层const表示指针所指的对象是常量
constexpr
c++11 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
指针和引用都能定义为constexpr类型,但是他们的初始值却受到严格要求,指针的初始值必须是nullptr或0,或者是存在于某个固定地址中的对象。函数内定义的变量一般来说并非存在固定地址中。相反的,定义在函数体外的变量地址固定不变,可以用来初始化constexpr指针
const int *p=nullptr; //p是一个指向整形常量的指针
constexpr int *q=nullptr; //q是一个指向整数的常量指针
auto
auto定义的变量必须有初始值
当auto使用引用的时候,其实使用引用的对象的类型作为auto的类型
decltype
如果decltype使用的表达式是一个变量,则decltype返回该变量的类型
decltype((variable))的结果永远是引用,而decltype(variable)只有当variable本身是引用时才是引用
类的定义
不建议把对对象的定义和类的定义放在一起