来自 C++Primer5th中文版没有plus 轮子哥强势审校
由于已经会c、Java 所以与C语言一样的内容不再提及。适合:会C语言的人快速入门 持续更新
左值lvalue:有名字的变量,有地址的 右值rvalue:生命只存在这句话中
int a=10,&x = a; x为a的别名,类似于指针的封装。可以用于函数形式参数f(int &x)修改x。
constexpr:检测变量的值是否是一个常量表达式 constexpr int x = 10;编译时就得到计算 constexpr函数
别名 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 让编译器去推断表达式所属类 int * ptr1 = 0; auto ptr2 = ptr1; auto忽略引用、顶层const 如果希望auto是个顶层const 需明确指出 const auto f = ci; 还可以将引用设为auto auto &g = ci;
decltype 类型指示符 编译器分析表达式得到他的类型,却不实际计算表达式的值。 decltype(f()) sum = x; decltype 返回const 和 引用在内的类型
//cpp primer里的一段例子 //看来cpp里的指针与引用有关,解引用实际上得到的是引用 int i = 42,*p=&i; decltype(*p) c;//错误:c是int &,必须初始化 decltype((i)) d;//错误:双层嵌套时cin>>s1;//cin读空格之前的内容,空格不读进去 getline(cin,s1);//读一整行,换行读进去 不存
string.size()返回size_type类型,无符号整数,尽量不要与int混用
比较的是字典顺序
相加时,需确保加号左右有一个是string
C name.h ->cpp cname,在cname中定义的名字属于std,而name.h则不然
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的带符号整形数,来用作两迭代器相减。
size_t数组下标的类型,无符号。定义在cstddef中。 像迭代器一样,库函数begin(),end()可以获取首元素指针 尾元素指针。 两指针相减的结果是ptrdiff_t类型,定义在cstddef,带符号
标准库类型如string vector下标必须是无符号,而数组内置的下标运算可以处理负值
多维数组 for-each循环 for(auto &row:ia) for(auto col:row) count<<col; 无论是否修改,第一层都需使用引用。若不使用&row,则默认初始化为指针。
