南京网站制作电话,中国作文网,梦幻西游官网,深圳seo优化外包数据类型#xff1a;
作用#xff1a;决定变量所占内存空间的字节大小#xff0c;和布局方式基本数据类型#xff1a; 算数类型#xff1a; 整形#xff08;bool / char……扩展集 / int / long……#xff09; 浮点形#xff08;float/double……#xff…数据类型
作用决定变量所占内存空间的字节大小和布局方式基本数据类型 算数类型 整形bool / char……扩展集 / int / long…… 浮点形float/double…… 部分整形除了bool char的扩展集会有更多的划分例如int( int 有符号/ unsigned int无符号) ……对于char(8bit):(char / signed char有符号-128---127 / unsigned char无符号0----256)空类型void复合类型声明符/类型修饰符( / * / const…… ) 基本数据类型其他类型对象类/结构体类型…… 字面值常量
定义直接看就可以得到它的值一望而知这样的常量非常常见如何知道它的类型字面值常量的数据类型由本身决定不用手动定义由常量的形式和值决定 整形可以写做二进制、十进制八进制、十六进制 如何看整形的数据类型 默认情况下:十进制(signed)八进制、十六进制signed / unsigned默认为算数类型int也可以为long / long long具体要在可以容纳当前值的情况下取最小尺寸其中short不能作为整形字面值的类型浮点默认为double类型的字面值字符‘ ’为char类型字符串“ ”为const char* 类型-常量字符数组[]其中会在字符串末尾添加\0空字符指针: nullptr为指针类型字面值布尔true / false为bool类型字面值 变量
对象有具体类型并且能存储数据的内存空间 表达式
概念由一个或多个运算对象组成不一定有运算符比如字面值42 / 常量a的值一元/二元/三元/运算符作用于 一/二/三 个运算对象函数调用fun()也算作特殊运算符复杂表达式含有多个运算符计算方式遵守优先级结合律求值顺序 左值右值
左值存储在栈 对象持久对象 变量常量数组指针引用表达式……对于常量不能作为赋值语句的左侧右值存储在寄存器 具体数据临时对象常量表达式变量的值临时对象……赋值要求左侧为可修改的左值除了const右侧为右值表达式可以作为左值;用的是在内存的地址也可以作为右值使用的是内存的地址中存储的值变量存储的id对应的val注意赋值语句中左值可以被当作右值使用它的值右值非对象不能作为左值被赋值作用…… 运算符与左值右值的关系
运算对象 要求左值赋值的左侧取地址取对象地址*解引用, 递增递减要求右值……返回值 要求左值赋值*解引用获取指针所指向地址上的对应的值递增递减要求右值取地址(指向运算对象的指针因此对于decltype()会根据括号内是什么运算符确定返回值比如返回右值--type*类型*返回左值----type 浅拷贝 深拷贝
浅拷贝默认拷贝构造只复制对象内的基本数据类型的成员变量而不复制对象内的指针成员变量所指向的内存空间id指针同时指向一个地址深拷贝会同时复制对象内的基本数据类型的成员变量和指针成员变量所指向的内存空间浅拷贝的问题 内存泄漏 同一个内存多次释放由于浅拷贝导致多个对象共享同一块内存当这些对象在析构时都会尝试释放这块内存导致同一块内存被多次释放空悬指针 当浅拷贝的对象中的一个对象提前释放其持有的内存会被释放而其他对象仍持有指向该内存的指针这些指针就变成了空悬指针数据不一致当其中一个对象修改这块内存中的数据时其他对象的对应数据也会被同时修改导致数据不一致的问题如何避免 使用智能指针std::shared_ptr和std::unique_ptr自定义拷贝构造函数自定义赋值运算符优缺点 浅拷贝节约内存操作和时间开销但是会导致指针问题。深拷贝需要更多的内存操作和时间开销深拷贝通常是更安全、更可靠 拷贝构造 拷贝赋值
实现类对象复制的两种特殊成员函数拷贝构造使用一个已存在的对象来初始化一个新对象时拷贝赋值将一个对象赋值给另一个已经存在的对象时 移动对象
移动对象不会发生拷贝大幅度提升性能右值引用 绑定到右值的引用绑定的为右值---将要销毁的对象同时普通引用为了方便区分为左值引用绑定的为左值---对象变量的值当作为表达式时可以有右值属性但变量本身是左值所以不能作为右值引用的绑定作用 移动语义直接从临时对象中转移资源而非通过拷贝完美转发参数的类型左值或右值和值类别临时或持久都能被正确无误地传递给目标函数提高程序运行效率std::move()显示的将左值转换为对应的右值引用类型