来自 C++Primer5th中文版没有plus 轮子哥强势审校
由于已经会c、Java 所以与C语言一样的内容不再提及。适合:会C语言的人快速入门
持续更新
左右值
左值lvalue:有名字的变量,有地址的
右值rvalue:生命只存在这句话中
引用
int a=10,&x = a;
x为a的别名,类似于指针的封装。可以用于函数形式参数f(int &x)修改x。
底层 顶层const
int i = 0;
int *const p1 = &i;//顶层const 不能改p1
const int ci = 41;
const int *p2 =&ci;//底层const 指向一个const int
const int &r = ci;//引用都是底层const
//顶层 *在const左侧 底层 *在右侧
constexpr
constexpr:检测变量的值是否是一个常量表达式 constexpr int x = 10;编译时就得到计算
constexpr函数
using
别名 using interger = int;
类型别名不能简单替换
typedef char *pstring
const pstring cstr = 0;
const char *cstr = 0;
//二者不等价,前者cstr不可变,后者cstr指向的char不可变
库函数基本属于命名空间std,需显示标明std::cin。
可以用using std::cin或者 using namespace std;
头文件一般不应该使用using
auto
auto 让编译器去推断表达式所属类
int * ptr1 = 0; auto ptr2 = ptr1;
auto忽略引用、顶层const
如果希望auto是个顶层const 需明确指出 const auto f = ci;
还可以将引用设为auto auto &g = ci;
decltype
decltype 类型指示符 编译器分析表达式得到他的类型,却不实际计算表达式的值。
decltype(f()) sum = x;
decltype 返回const 和 引用在内的类型
//cpp primer里的一段例子
//看来cpp里的指针与引用有关,解引用实际上得到的是引用
int i = 42,*p=&i;
decltype(*p) c;//错误:c是int &,必须初始化
decltype((i)) d;//错误:双层嵌套时
string
cin>>s1;//cin读空格之前的内容,空格不读进去
getline(cin,s1);//读一整行,换行读进去 不存
string.size()返回size_type类型,无符号整数,尽量不要与int混用
比较的是字典顺序
相加时,需确保加号左右有一个是string
头文件
C name.h ->cpp cname,在cname中定义的名字属于std,而name.h则不然
vector
push_back() 添加
不能用下标添加元素
vector的类型总是包括元素的类型 如vector::szie_type
初始化
拷贝初始化= 只能停供一个值
类内初始值 只能使用拷贝初始化或者花括号形式
初始元素值的列表,只能使用花括号进行列表初始化,不能使用括号
括号初始化应该是类似 多态 调用函数进行初始化
迭代器
也可以理解为指针的封装
begin()返回第一个元素 end()返回尾元素下一个。若元素为空,则两者相同
只有string、vector等标准库类型有下标运算符,但是所有标准库容器的迭代器都定义了 == 和 !=,大多数都没定义<,所以一般使用 前者在for循环中
迭代器类型 iterator/const_iterator,一般使用auto
cbegin(),cend()一定会返回const_iterator,begin() end()视常量而定。
解引用 (*it).empty(),括号不可省略。或者可以使用箭头运算符->
vector 增长会使迭代器失效,也不能在for中增长。
部分迭代器定义了 difference_type的带符号整形数,来用作两迭代器相减。
数组
int *ptrs[10];//ptrs是一个含有10个整形指针的数组
int &refs[10] = ;//不存在引用数组
int (*Parray)[10] = &arr;//Parray指向一个含有10个整数的数组
int(&arrRef)[10] = arr;//arrRef引用一个含有10个整数的数组
int *(&arry)[10] = ptrs;//arry是数组的引用,该数组含10个指针
//由内向外 由右向左读
size_t数组下标的类型,无符号。定义在cstddef中。
像迭代器一样,库函数begin(),end()可以获取首元素指针 尾元素指针。
两指针相减的结果是ptrdiff_t类型,定义在cstddef,带符号
标准库类型如string vector下标必须是无符号,而数组内置的下标运算可以处理负值
多维数组 for-each循环
for(auto &row:ia)
for(auto col:row)
count<<col;
无论是否修改,第一层都需使用引用。若不使用&row,则默认初始化为指针。