首页
关于
友链
其它
统计
壁纸
Search
1
修改Linux Kernel defconfig的标准方法
5,600 阅读
2
cgroup--(4)cgroup v1和cgroup v2的详细介绍
5,135 阅读
3
Android系统之VINTF(1)manifests&compatibility matrices
5,067 阅读
4
c语言的__attribute__
2,994 阅读
5
Android系统之VINTF(3)Matching Rules
2,396 阅读
默认分类
文章收集
学习总结
每天一刷
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
工具
软件工具
Bug
COMPANY
登录
Search
标签搜索
shell
Linux
c
uboot
Vim
vintf
Linux驱动
Android
device_tree
git
DEBUG
链表
数据结构
IDR
内核
ELF
gcc
网址
内存管理
进程管理
adtxl
累计撰写
342
篇文章
累计收到
8
条评论
首页
栏目
默认分类
文章收集
学习总结
每天一刷
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
工具
软件工具
Bug
COMPANY
页面
关于
友链
其它
统计
壁纸
搜索到
15
篇与
的结果
2021-03-08
CPP基础--表达式
暂无简介
2021年03月08日
629 阅读
0 评论
0 点赞
2021-03-08
CPP基础--语句之范围for语句
范围for语句C++11标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。范围for语句的语法形式是:for (declaration : expression) statementexpression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者vector等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员。declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值,之后才会执行statement。所有元素都处理完毕后循环终止。
2021年03月08日
602 阅读
0 评论
0 点赞
2021-03-08
CPP基础--函数
暂无简介
2021年03月08日
595 阅读
0 评论
0 点赞
2021-03-08
CPP基础--变量和基本类型之const限定符
const限定符因为const对象一旦创建后其值不能更改,因此创建时就必须初始化在不改变const对象的操作中还有一种是初始化,如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要:int i = 42; const ci = i; // correct int j = ci; // correct尽管ci是整型常量,但无论如何ci中的值还是一个整型数。ci的常量特征仅仅在执行改变ci的操作时才会发挥作用。当用ci去初始化j时,根本无须在意ci是不是一个常量。拷贝一个对象的值并不会改变它,一旦拷贝完成,新的对象就和原来的对象没有关系了。默认状态下,const对象仅在文件内有效当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。某些时候有这样一种const变量,它的初始值不是一个常量表达式,但又确实有必要在文件间共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。相反,我们想让这类const对象像其他(非常量)对象一样工作,也就是说,只在一个文件中定义const,而在多个文件中声明并使用它解决办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就可以了;// file_1.cc定义并初始化了一个常量,该常量能被其他文件访问 extern const int bufSize = fcn(); // file_1.h头文件 extern const int bufSize; // 与file_1.cc中定义的bufSize是同一个file_1.h头文件中的声明也由extern做了限定,其作用是指明bufSize并非本文件所独有,它的定义将在别处出现。如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字1. const的引用可以把引用绑定到const对象上,就像绑定到其它对象上一样,我们称之为对常用的引用(reference to const)。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象:const int ci = 1024; const int &r1 = ci; // correct,引用及其对应的对象都是常量 r1 = 42; // 错误,r1是对常量的引用 int &r2 = ci; // 错误,试图让一个非常量引用指向一个常量对象。假设该初始化合法,则可以通过r2来改变它引用对象的值,这显然是不正确的。初始化和对const的引用引用的类型必须与其所引用的对象的类型一致,但是有两个例外。第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可,尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:int i = 42; const int &r1 = i; // 允许将const int&绑定到一个普通的int对象上 const int &r2 = 42; // 正确: r1是一个常量引用 const int &r3 = r1 * 2; // 正确; // r3是一个常量引用 int &r4 = r1 * 2; // 错误:r4是一个普通的非常量引用可以这样做的原因如下,double dval = 3.14; const int &ri = dval;编译器把上述代码变成了如下形式const int temp = dval; // 由双精度浮点数生成一个临时的整型常量 const int &ri = temp; // 由ri绑定这个临时量如果ri不是常量,就允许对ri赋值,这样就会改变ri所引用对象的值。注意,此时绑定的对象是一个临时量而非dval。程序员既然让ri引用dval,就肯定想通过ri改变dval的值,否则干什么要给ri赋值呢?如此看来,既然大家都不会想着把引用绑定到临时量上,C++语言也就把这种行为归为非法。对const的引用可能引用一个并非const的对象int i = 42; int &r1 = i; // 引用ri绑定对象i const int &r2 = i; // r2也绑定对象i,但是不允许通过r2修改i的值 r1 = 0; // r1并非常量,i的值修改为0 r2 = 0; // 错误:r2是一个常量引用不允许通过r2修改i的值2. 指针和const指向常量的指针(pointer to const)不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针:const double pi = 3.14; double *ptr = π // error const double *cptr = π // correct *cptr = 42; // errorconst指针常量指针(const pointer),将指针本身定为常量。常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。int errnumb= 0; int *const curErr = &errNumb; // curErr将一直指向errNumb const double pi = 3.14159; const double *const pip = π // pip是一个指向常量对象的常量指针3. 顶层const用名词顶层const(top-level const)表示指针本身是个常量用名词底层const(low-level const)表示指针所指的对象是一个常量4.constexpr和常量表达式常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。以下均不是常量表达式;int staff_size = 27; const int sz = get_size();constexpr变量在一个复杂系统中,很难(几乎不能)分辨一个初始值到底是不是一个常量表达式。C++11标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。一般来说,如果你认定变量是一个常量表达式,那就把它声明称constexpr类型。字面值类型常量表达式的值需要在编译时就得到计算,因此对声明constexpr时用到的类型必须有所限制。因为这些类型一般比较简单,值也显而易见、容易得到,就把它们称为"字面值类型"(literal type)到目前为止,算术类型、引用和指针都属于字面值类型。自定义类Sales_item、IO库、string类型则不属于字面值类型,也就不能被定义成constexpr。指针和constexpr必须明确一点,在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关:const int *p = nullptr; // p是一个指向整型常量的指针 constexpr int *q = nullptr; // q是一个指向整数的常量指针
2021年03月08日
638 阅读
0 评论
0 点赞
2021-03-08
CPP基础--标准库类型vector
标准库类型vector标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中每个对象都有一个与之对应的索引,索引用于访问对象。因为vector"容纳着"其他对象,所以也常被乘做容器(container)。vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector<int>vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector。1. 定义和初始化vector对象和任何一种类类型一样,vector模板控制着定义和初始化向量的方法。列表初始化vector对象用花括号括起来的0个或多个初始元素值被赋给vector对象:vector<string> articles = {"a", "an", "the"};创建指定数量的元素还可以用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象:vector<int> ivec(10, -1); vector<string> svec(10, "hi");值初始化通常情况下,可以只提供给vector对象容纳的元素数量而不用略去初始值。此时库会创建一个值初始化的(value-initialized)元素初值,并把它赋给容器中的所有元素。这个初值由vector对象中元素的类型决定。vector<int> ivec(10); // 10个元素,每个都初始化为0 vector<string> svec(10); // 10个元素,每个都是空string对象对这种初始化的方式有两个特殊限制:其一,有些类要求必须明确地提供初始值,如果vector对象中元素的类型不支持默认初始化,我们就必须提供初始的元素值。对这种类型的对象来说,只提供元素的数量而不设定初始值无法完成初始化工作。列表初始值还是元素数量在某些情况下,初始化的真实含义依赖于传递初始值时用的是花括号还是圆括号。vector<int> v1(10); // 10个元素,每个值都是0 vector<int> v2{10}; // 1个元素,值为10 vector<int> v3(10, 1); // 10个元素,每个值都是1 vector<int> v4{10, 1}; // 2个元素,值分别是10和1如果用的是圆括号,可以说提供的值是用来构造(construct)vector对象的。如果用的是花括号,可以表述成我们想列表初始化该vector对象。另一方面,如果初始化时用了花括号的形式但是提供的值又不能用来列表初始化,就要考虑用这样的值来构造vector对象了。vector<string> v5{"hi"}; vector<string> v6("hi"); // error:不能使用字符串字面值构建vector对象 vector<string> v7{10}; // v7有10个默认初始化的元素 vector<string> v8{10, "hi"}; // v8有10个值为"hi"的元素2. 向vector对象添加元素经常使用vector的情况是并不清楚实际所需的元素个数,元素的值也经常无法确定。还有些时候即使元素的初值已知,但如果这些值总量较大而各不相同,那么在创建vector对象的时候执行初始化操作也会显得过于繁琐。我们可以利用vector成员函数push_back()向其中添加元素vector<int> v1; for (int i = 0; i < 100; i++) { v1.push_back(i); }向vector对象添加元素蕴含的编程假定必须要确保缩写的循环正确无误,特别是在循环有可能改变vector对象容量的时候如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。范围for语句体内不应改变其所遍历序列的大小。3. 其它vector操作除了push_back之外,vector还提供了几种其他操作,大多数都和string的相关操作类似计算vector内对象的索引使用下标运算符能获取到指定对象的元素。和string一样,vector对象的下标也是从0开始计起,下标的类型是相应的size_type类型。只要vector对象不是一个常量,就能向下标运算符返回的元素赋值。不能使用下标形式添加元素vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素。关于下标必须明确的一点是:只能对确知已存在的元素执行下标操作。
2021年03月08日
697 阅读
0 评论
0 点赞
1
2