首页
关于
友链
其它
统计
壁纸
Search
1
修改Linux Kernel defconfig的标准方法
4,786 阅读
2
Android系统之VINTF(1)manifests&compatibility matrices
4,455 阅读
3
cgroup--(4)cgroup v1和cgroup v2的详细介绍
4,113 阅读
4
c语言的__attribute__
2,812 阅读
5
Android系统之VINTF(3)Matching Rules
2,220 阅读
默认分类
文章收集
学习总结
每天一刷
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
工具
软件工具
Bug
登录
Search
标签搜索
shell
Linux
c
uboot
Vim
vintf
Linux驱动
Android
device_tree
git
DEBUG
链表
数据结构
IDR
内核
ELF
gcc
网址
内存管理
进程管理
adtxl
累计撰写
332
篇文章
累计收到
8
条评论
首页
栏目
默认分类
文章收集
学习总结
每天一刷
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
工具
软件工具
Bug
页面
关于
友链
其它
统计
壁纸
搜索到
21
篇与
Language
的结果
2022-07-17
此内容被密码保护
加密文章,请前往内页查看详情
2022年07月17日
449 阅读
0 评论
0 点赞
2021-11-01
c语言中的#和##
暂无简介
2021年11月01日
663 阅读
0 评论
0 点赞
2021-03-17
C库函数-snprintf()
暂无简介
2021年03月17日
776 阅读
0 评论
0 点赞
2021-03-17
C库函数-sscanf()
暂无简介
2021年03月17日
604 阅读
0 评论
0 点赞
2021-03-16
C库函数-fgets()
暂无简介
2021年03月16日
719 阅读
0 评论
0 点赞
2021-03-10
CPP基础--表达式之类型转换
类型转换何时发生隐式类型转换在下面这些情况下,编译器会自动地转换运算对象的类型:在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。在条件中,非布尔值转换成布尔类型初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型如果算术运算关系或关系运算的运算对象有多种类型,则需要转换成同一种类型。函数调用时也会发生类型转换1. 算术转换算术转换的含义是把一种算术类型转换成另外一种算术类型。2. 其他隐式类型转换数组转换成指针在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针:int ia[10]; // 含有10个整数的数组 int* ip = ia; // ia转换成指向数组首元素的指针当数组被用作decltype关键字的参数,或者作为取地址符(&)、sizeof及typeid等运算符的运算对象时,上述转换不会发生。同样的,如果用一个引用来初始化数组,上述转换也不会发生。指针的转换C++还规定了其他的指针转换方式,包括常量整数值0或者字面值nullptr能转换成任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*。转换成布尔类型存在一种从算术类型或指针类型向布尔类型自动转换的机制。如果指针或算术类型的值为0,转换结果是false;否则转换结果是true转换成常量允许将指向非常量类型的指针转换成指向相应的常量类型的指针,对于引用也是这样。3. 显式转换有时我们希望显式地将对象强制转换成另外一种类型。例如,如果想在下面的代码中执行浮点数除法;int i, j; double slope = i/j;就要使用某种方法将i或j显式地转换成double,这种方法称作强制类型转换(cast)。注:虽然有时不得不使用强制类型转换,但这种方法本质上是非常危险的。命名的强制类型转换一个命名的强制类型转换具有如下形式:cast-name<type>(expression);其中,type是转换的目标类型,而expression是要转换的值。如果type是引用类型,则结果是左值。cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。cast-name指定了执行的是哪种转换。static_cast任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。// 进行强制类型转换以便执行浮点数除法 double slope = static_cast<double>(j) / i;static_cast对于编译器无法自动执行的类型转换也非常有用。例如,我么可以使用static_cast找回存在于void*指针中的值:void* p = &d; // 正确:任何非常量对象的地址都能存入void* // 将void*转换回初始的指针类型 double *dp = static_cast<double*>(p);const_castconst_cast只能改变运算对象的底层const:const char *pc; char *p = const_cast<char*>(pc); //正确,但是通过p写值是未定义的行为对于将常量对象转换成非常量对象的行为,我们一般称其为“去掉const性质”。一旦我们去掉了某个对象的const性质,编译器就不能再阻止我们对该对象进行写操作了。如果对象本身不再是一个常量,使用强制类型转换获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果。只有const_cast能改变表达式的常量属性,同样,const_cast不能用来改变表达式的类型。const_cast常常用于有函数重载的上下文中。reinterpret_castreinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。建议:避免强制类型转换,尤其是reinterpret_cast
2021年03月10日
822 阅读
0 评论
0 点赞
2021-03-10
CPP基础--迭代器介绍
迭代器介绍可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator)。类似于指针类型,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。1. 使用迭代器和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器。如有下述语句:// b表示v的第一个元素,e表示v尾元素的下一位置 auto b = v.begin(), e = v.end(); // b和e的类型相同end成员则负责返回指向容器(或string对象)“尾元素的下一位置”的迭代器,也就是说,该迭代器指示的是容器的一个本不存在的“尾后”元素。这个迭代器没什么实际含义,仅是个标记而已,表示我们已经处理完了容器中的所有元素。end成员返回的迭代器常被称作尾后迭代器。如果容器为空,则begin和end返回的都是同一个迭代器,都是尾后迭代器。迭代器运算符和指针类似,也能通过解引用迭代器来获取它所指示的元素,执行解引用的迭代器必须合法并确实指示着某个元素。试图解引用一个非法迭代器或者尾后迭代器都是未被定义的行为。string s("some string"); if (s.begin() != s.end()) { // 确保s非空 auto it = s.begin(); // it表示s的第一个字符 *it = toupper(*it); // 将当前字符改写成大写形式 }将迭代器从一个元素移动到另外一个元素迭代器使用递增(++)运算符来从一个元素移动到下一个元素。因为end返回的迭代器并不实际指示某个元素,所以不能对其进行递增或解引用的操作。迭代器类型就像不知道string和vector的size_type成员到底是什么类型,一般来说我们也不知道(其实是无须知道)迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:vector<int>::iterator it; // it能读写vector<int>的元素 string::iterator it2; // it2能读写string对象中的字符 vector<int>::const_iterator it3; // it3只能读元素,不能写元素 string::const_iterator it4; // it4只能读字符,不能写字符begin和end运算符begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iterator为了便于专门得到const_iterator类型的返回值,C++11新标准引入了两个新函数,分别是cbegin和cend.不论vector对象本身是否是常量,返回值都是const_iterator。结合解引用和成员访问操作解引用迭代器可获得迭代器所指的对象,如果该对象的类型恰好是类,就有可能希望进一步访问它的成员。例如,对于一个由字符串组成的vector对象来说,要想检查其元素是否为空,令it是该vector对象的迭代器,只需检查it所指字符串是否为空就可以了,其代码如下,(*it).empty()为了简化上述表达式,C++定义了箭头运算符(->)。箭头运算符把解引用和成员访问两个操作结合在一起,也就是说,it->mem和(*item).mem表达的意思相同某些对vector对象的操作会使迭代器失效虽然vector对象可以动态地增长,但是也会有一些副作用。已知的一个限制是不能在范围for循环中向vector对象添加元素。另外一个限制是任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。2. 迭代器运算string和vector迭代器提供了更多额外的运算符,一方面可使得迭代器每次移动跨过多个元素,另外也支持迭代器进行关系运算。所有这些运算被称作迭代器运算所谓两个迭代器之间的距离指的是右侧的迭代器向前移动多少位置就能追上左侧的迭代器,其类型是名为difference_type的带符号整型数。
2021年03月10日
795 阅读
0 评论
0 点赞
2021-03-09
CPP基础--变量和基本类型之处理类型
处理类型1. 类型别名类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名还有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用,还有助于清楚地知道使用该类型的真实目的。typedeftypedef double wages; // wages是double的同义词 typedef wages base, *p; // base是double的同义词,p是double*的同义词usingC++11标准规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名using SI = Sales-iteml // SI是Sales_item的同义词指针、常量和类型别名如果某个类型别名指代的是复合类型和常量,那么把它用到声明语句里就会产生意向不到的后果typedef char *pstring; const pstring cstr = 0; // cstr是一个指向char的常量指针 const pstring *ps; // ps是一个指针,它的对象是指向char的常量指针const是对给定类型的修饰,此时pstring实际上是一个指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。遇到一条使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子,以理解该语句的含义:const char *cstr = 0; // 是对const pstring cstr的**错误理解**声明语句中用到了pstring时,其基本数据类型是指针。可是用char*重写了声明语句后,数据类型就变成了char,*成为了声明符的一部分。这样改写的结果是,const char成了基本数据类型。2. auto类型说明符auto类型说明符,可以让编译器替我们去分析表达式所属的类型。使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样:auto i = 0, *p = &i; // 正确:i是整数、p是整型指针 auto sz = 0, pi = 3.14; // 错误:sz和pi的类型不一致复合类型、常量和auto编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。其次,auto一般会忽略掉顶层const,同时底层const则会保留下来,比如当初始值是一个指向常量的指针时:int i = 0, &r = i; auto a = r; const int ci = i, &cr = ci; auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了) auto c = cr; // c是一个整数 auto d = &i; // d是一个整型指针 auto e = &ci; // e是一个指向整数常量的指针(对常量对象取地址是一种底层const)如果希望推断出的auto类型是一个顶层const,则需要明确指出:const auto f = ci; // ci的推演类型是int,f是const int3. decltype类型指示符有时会遇到这种情况:希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。decltype,它的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值
2021年03月09日
784 阅读
0 评论
0 点赞
2021-03-09
CPP基础--变量和基本类型之自定义数据结构
暂无简介
2021年03月09日
732 阅读
0 评论
0 点赞
2021-03-08
C++标准库--动态内存
暂无简介
2021年03月08日
771 阅读
0 评论
0 点赞
1
2
3