cpp知识点摘录

tech2026-02-19  2

来自 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,则默认初始化为指针。

最新回复(0)