文件结束符:windows:ctrl+z unix:ctrl+d
文件重定向:程序名 < 输入文件名 > 输出文件名 如:add <input.txt> output.txt
宽字符:wchar_t 可以存放机器最大扩展字符集中的任意一个字符
Unicode字符:char16_t,char32_t 所有自然语言中的字符标准
unsigned:无符号 如果有unsigned修饰的变量且相减之后为赋值,则结果取模类型最大值,如果需要一个不大的非负整数可用unsigned char
20 /* 十进制 */ 024 /* 八进制 */ 0x14 /* 十六进制 */
初始化:创建变量时赋予其一个初始值
赋值:将对象当前值擦除,用一个新值代替
声明extern: 如 extern int i; //声明 int i;//定义 变量可用多次声明,但只能定义一次
标识符的规则:1.标识符要能体现含义 2.变量名一般用小写字母 3.用户自定义类一般用大写开头 如:struct Tree{}; 4.如果标识符由多个单词组成,应有明显区分 如studentName or student_name
引用&: 引用必须被初始化,且必须引用对象 如 int &a = b;//正确 i nt &a;//错误 int &a = 10;//错误 注意:引用并非对象,它只是已经存在的对象的另一个名字
指针*: 其实指针*就是一个解引符号,注意:建议初始化所有指针 int *p = &a; //正确 int *p; p = &a; //正确 int *p; *p = &a;//错误
1 int i=42; 2 int *p = nullptr; //p是一个指针 3 int *&r = p; //r是一个对指针p的引用 4 r = &i; // r引用了一个指针,因此给r赋值&i,就是令p指向i 5 *r = 0; // 解引用r得到i,也就是p指向的对象,将i的值改为0
const限定符: 引用的类型必须与引用的对象的类型一致(有两种例外情况)
1 const int ci = 1024; 2 const int &r1 = ci; //正确 3 r1 = 42; //错误:r1是对常量的引用 4 int &r2 = ci; //错误:试图让一个非常量引用指向一个常量
第一种例外情况:
1 double dval = 3.14; 2 const int &ri = dval; //正确 3 4 相当于 5 6 const int temp = dval; //生成一个零时的整型常量 7 const int &ri = temp; //让ri绑定这个临时量 8 如果 &ri不是常量 如:int &ri = temp; //错误,修改ri时不知道赋值给谁
指针和const:
1 const double pi = 3.14; 2 const double *cptr = π //正确 3 double *ptr = π //错误,ptr是一个普通指针 4 *cptr = 42;//错误,不能给*cptr赋值 5 6 double dval = 3.14; 7 cptr = dval; //正确,但是不能通过*cptr修改dval的值
常量指针: int *const p = &a; *p将一直指向a,且*p必须初始化
同理: const int *const p = &a; 都不可修改
1 int i = 0; 2 int *const p1 = &i; //不能改变p1的值,是顶层const 3 const int ci = 42; //不能改变ci的值,是顶层const 4 const int *p2 = &ci; //允许改变p2的值,是底层const
c++ 11 constexpr: 一般来说,如果你认定变量时一个常量表达式,那就把它声明称constexpr类型
constexpr和指针:限定符constexpr仅对指针有效,与指针所指的对象无关
typedef : typedef double a,*b; //a是double的同义词,b是double *的同义词
c++11 decltype:选择并返回操作数的数据类型 如 decltype(f()) sum = x;//如果f() 返回值类型为int,那么等价于 int sum = x;
注意:int *p; decltype(*p) 的结果类型是 int & 而非 int decltype((variable)) (双层括号) 的结果永远是引用 如:int i; decltype((i)) == int &
如果i是int型,则表达式i=x的类型是int & , 如:int i ; decltype(i = x) == int &
头文件保护符 : #ifndef 当且仅当变量未定义时为真,一旦结果为真,则执行后续操作直至遇见 #endif 指令为止
string:
1 string s5 = "hiya"; //拷贝初始化 2 string s6("hiya"); //直接初始化 3 string s7(10,'c'); //直接初始化 ,cccccccccc
getline(cin,str) 一次读一行
string::size_type类型 : .size()的返回值类型 ,是一个无符号的返回类型
注意: 如果一个具有负值的int,那么表达式 str.size() < n 几乎肯定是true; 因为负值n会自动转化为一个比较大的无符号值
vector: 注意:只能对确定已知存在的元素执行下标操作
1 vector <int> v1(10); //10个元素,全是0 2 vector <int> v2{10}; //1个元素,10 3 vector <int> v3(10,1); //10个元素,全是1 4 vector <int> v4{10,1}; //2个元素,10,1 5 6 vector <string> v5{"hi"}; //1个元素,“hi” 7 vector <string> v6("hi"); //错误 8 vector <string> v7(10,"hi"); //10个元素,10个“hi”
迭代器:iterator 和 const_iterator(只读)
1 vector <int> ::iterator it; 2 vector <int> v; 3 for(it = v.begin();it != v.end();++it) 4 *it = 1;