个人学习笔记,记录一些之前未掌握的知识点,不全面也不按特定顺序。
1,省略std::
在 #include<iostream> 后面,添加using namespace std; ,则在之后可以省略std::。
2,小数输出精度控制
C++中,小数的默认输出精度是6位有效数字,可以包含头文件#include<iomanip>后改变。
cout << setprecision(n) << f << endl;
通过上句的n来控制输出有效数字。
3,类型的选择
通常使用int,short一般情况下太小,long和int相差无几,当int不够用时,直接用long long(C++11新特性)。
浮点数运算通常选double,float通常精度不够,long double的 精度通常没有必要。
4,慎用无符号数unsigned
当赋给无符号数类型一个超过它的表示范围时,结果是初始值对无符号表示数值综述驱魔后的余数。
unsigned char c = -1;//假设char占8比特,c的值为255
当无符号数与有符号数做运算时,有符号数会强制转换成无符号数。
unsigned u =10;
int i = -42;
std::cout<<u+i<<std::endl;//如果int占32位,输出4294967264
5,字面值
20 /*十进制*/ 024 /*八进制*/ 0x14 /*十六进制*/
3.14 /*double*/ 3.14f /*浮点数*/ 3.14L/*long double*/
6,初始化,
列表初始化(C++11新特性)
int a ={0}; int a{0};
但存在丢失信息的风险,将报错:
long double ld =3.1415926536;
int a {ld}, b = {ld}; //错误:转换未执行,因为存在丢失信息的危险
int c (ld), d = ld; //正确:转换执行,且确实丢失了部分值
任何函数内部变量必须初始化,任何函数外部的变量会自动初始化
7,声明变量 extern
在变量名前添加关键字extern,而且不要显式地初始化变量,否则抵消了extern的作用
extern int i; //声明i而非定义i
extern double pi = 3.1416; //定义
8,变量命名规范
标识符要能体现实际意义
变量名一般用小写字母,如index。
用户自动以的类名一般用大写字母开头,如Sales_item。
如果标识符由多个单词注册,则单词间应有明显区分,如student_loan或者studentLoan
9,引用
引用即别名,引用并非对象,它只是一个已经存在的对象所起的另一个名字。
引用本身不是对象,所以引用的引用则非法:
int a =2;int &b = a; int &c = b;//正确
int &(&c )=a;//错误
除了两种例外,引用的的类型必须与其所引用对象保持一致:
int &refVal1= 10; //错误:引用类型的初始值必须是一个对象
double dval = 3.14;
int &reVal2 = dval; //错误:此处的引用类型的初始值必须是int类型对象
const int &r = 42; //正确:第一种列外,初始化常量引用时允许用任意表达式作为初始值
//第二种例外,学到了再补
10,指针
指针存在某个对象的地址,需要用取地址符来获取 (&)。
因为引用不是对象,没有地址,所以不能定义指向引用的指针。
double dval; //正确:初始值是double型对象的地址
double *pd =&dval; //正确:初始值是指向double对象的指针
int *pi =pd; //错误:指针pi的类型和pd的类型不匹配
pi = &dval; //错误:试图把double型对象的地址赋给int型指针
利用指针访问对象,使用解引用符(*):
int ival = 42;
int *p = &ival; //p存存放着变量ival的地址,或者说p是指向变量 ival的指针
cout<<*p; //由符号*得到指针p所指向的对象,输出42
*p = 0; //由符号*得到指针p所指向的对象,即可以经由p为变量ival复制
cout<<*p; //输出0
空指针不指向任何对象
int *p = 0;int *p =NULL;int *p =nullptr;(最佳方式,c++11新特性)
void*指针,可以存在任意对象的地址。void*能做的事有限:
和别的指针比较、作为函数的输入和输出,或者赋给另外一个void*指针。
但不能直接操作void*指针所指的对象 ,因为不能却确定这个对象到底是什么变量。
指向指针的引用:
int *p; //p是一个int型指针
int *&r = p; //r是一个对指针p的引用