【C++ grammar】Enhancement for Type System (C++11 对类型系统的增强)

数据类型 (Data type)

int, long int, double, struct, char *, float [], int (*f)()…

计算机程序构造块

计算机程序构造块是不同大小粒度的计算机程序组成部分,它包括变量、表达式、函数或者模块等。

类型系统 (Type System)

类型系统:在编程语言中,“类型系统”是将“type”属性指定给不同计算机程序构造块的规则集
为什么使用类型系统:减少程序中可能出现的bug
1、定义不同程序块之间的接口
2、检查多个块之间是否以一致的方式连接在一起
类型系统分为:静态类型和动态类型
类型系统存在于我们编写程序中,编译器会帮我们检查类型系统。
如果检查发生在编译期(编译的时候检查类型系统是否一致),称为静态类型
如果检查发生在运行期(执行的时候检查类型系统是否一致),称为动态类型
如果检查同时存在与编译期间和运行期间,称为混合类型
C、C++、Java是静态类型
Python是动态类型
在这里插入图片描述

Automatic Type Deduction: auto (C++11) 自动类型推导:auto关键字

C++03及之前的标准种,auto放在变量声明之前,声明变量的存储策略。但是这个关键字常省略不写。
C++11中,auto关键字放在变量之前,作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型
例:

int a = 10;
auto au_a = a;//自动类型推断,au_a为int类型 
cout << typeid(au_a).name() << endl;

result:

int

注意点:
1、auto 变量必须在定义时初始化,这类似于const关键字

auto a1 = 10;  //正确 
auto b1;   //错误,编译器无法推导b1的类型
b1 = 10;

2、定义在一个auto序列的变量必须始终推导成同一类型

auto a4 = 10, a5{20};   //正确 
auto b4{10}, b5 = 20.0; //错误,没有推导为同一类型

3、如果初始化表达式是引用或const,则去除引用或const语义。

int a{10}; int &b = a;
auto c = b;   //c的类型为int而非int&(去除引用)
const int a1{10};
auto b1 = a1; //b1的类型为int而非const int(去除const) 

4、如果auto关键字带上&号,则不去除引用或const语意

int a = 10; int& b = a;
auto& d = b;//此时d的类型才为int&
const int a2 = 10;
auto& b2 = a2;//因为auto带上&,故不去除const,b2类型为const in

5、初始化表达式为数组时,auto关键字推导类型为指针

int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl; //输出int * (输出与编译器有关)

6、若表达式为数组且auto带上&,则推导类型为数组类型

int a7[3] = { 1, 2, 3 };
auto& b7 = a7;
cout << typeid(b7).name() << endl; //输出int [3] (输出与编译器有关)

7、C++14中,auto可以作为函数的返回值类型和参数类型

auto max(int x , int y)
{return x>y?x:y;
}

我们在使用auto时有时会遇到一些特殊情况。

1、 “int x = 3;” 能变成auto形式吗?
当我们非常希望能够在变量定义的时候,【明确】地指出变量的类型,而且不希望随便更改其类型,那么我们可以使用下面的方法:

auto x = int {3};  // 初始化列表auto y = int {3.0}; // 编译器报错,初始化列表不能窄化auto z = int (3.0);  // C风格的强制类型转换,z的值是整数3

2、 auto和初始化列表一起用 要避免在一行中使用直接列表初始化和拷贝列表初始化,也就是,下面的代码是有问题的:

auto x { 1 }, y = { 2 };  // 不要同时使用直接和拷贝列表初始化

在这里插入图片描述
“AAA原则”:总是使用auto!
问题:能用auto声明C风格的数组吗?
如果你尝试让C++11编译器编译如下代码,它会报错

// 包含头文件
// 声明主函数
// ......
auto x[] = {1,2,3};

auto 不能用于声明数组,否则无法通过编译,报auto类型不能出现在顶级数组类型中。
也就是说auto只能是指针指向数组的而不能去声明一个数组。

自动类型推导:decltype关键字

1、关键字decltype的用法
decltype利用已知类型声明新变量。
有了auto,为什么还要整出一个decltype?原因是,我们有时候想要从表达式的类型推断出要定义的变量类型,但不想用该表达式的值初始化变量。
decltype是在编译期推导一个表达式的类型,而不用初始化,其语法格式有点像sizeof。它只做静态分析,因此它不会导致已知类型表达式执行。
decltype 主要用于泛型编程(模板)
2、代码示例

#include<iostream>
using namespace std;
int  fun1()  { return 10;  }
auto fun2()  { return 'g'; }  // C++14
int main(){// Data type of x is same as return type of fun1()// and type of y is same as return type of fun2()decltype(fun1()) x;  // 不会执行fun1()函数,相当于 int x;decltype(fun2()) y = fun2();		//auto y=>char y;cout << typeid(x).name() << endl;cout << typeid(y).name() << endl;return 0;
}

我们可以发现,我们将fun2的‘g’改变,例如改成4,y类型也改了。
这样我们修改了返回值类型,程序仍然能够正常运行。
这说明,使用类型推导是有好处的。
3、decltype与auto的对比
decltype和auto都是C++11自动类型推导的关键字。它们有很多差别:
auto忽略最上层的const,decltype则保留最上层的const
auto忽略原有类型的引用,decltype则保留原有类型的引用
对解引用操作,auto推断出原有类型,decltype推断出引用

4、auto推断时会实际执行,decltype不会执行,只做分析。
总之在使用中过程中和const、引用和指针结合时需要特别小心。

小结

C++11对C++03的增强,或者说C++11的“Modern”的特点之一就是由auto和decltype构成的自动类型推导系统。

但是,auto与初始化列表结合,又有一些坑。你在写代码时如果经常将auto与列表初始化一起使用,那么会遇到一些问题。本节只介绍auto的常见用法。auto与初始化列表结合的坑,得由你自己去踩了。

为了说明auto有多么复杂,这里摘取 https://cppreference.com 网站列出的auto的语法格式:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、织物组织相关基本概念

一、织物形成的五大运动&#xff1a;开口、引纬、打纬、送经、卷取 开口运动&#xff08;先开口让织物形成上下两层&#xff09; 引纬运动&#xff08;在上下两层经纱之间进行引纬&#xff0c;把纬纱穿入上下两层经纱之间&#xff0c;从而实现经纱纬纱之间的交织&#xff09; …

达尔豪斯大学计算机科学世界排名,达尔豪斯大学成了全加最好,这又是个什么排名?...

原标题&#xff1a;达尔豪斯大学成了全加最好&#xff0c;这又是个什么排名&#xff1f;没有“八大”的知名&#xff0c;没有“常春藤”的受宠&#xff0c;虽然它只是众多名校中的普通一个&#xff0c;但只要你对它有个稍微的了解&#xff0c;你一定会爱上它的&#xff01;它虽…

tag标签记录

看到项目代码中有一个自定义的tag标签&#xff0c;想起以前自己写过的标签&#xff0c;竟然忘记的差不多了&#xff0c;手一痒&#xff0c;自己写个简单的tag标签&#xff0c;回顾一下历史知识 首先建一个servlet工程&#xff0c;然后写个index.jsp&#xff0c;项目跑起来&…

LeetCode 53:最大子序和解题以及优化思路(第一次独立刷题记录)

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。 进阶: 如果你已经实现…

三、规则组织的衍生组织——经山形组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 经山形组织图&#xff1a; 左半部分&#xff1a;&#xff0c;3上2下1上2下&#xff0c;右斜&#xff0c;飞数为1 右半部分&#xff1a;&#xff0c;3上2下1上2下&#xff0c;左斜&#xff0c;飞数为-1 左右两部分只有飞数是相…

储存过程生成器

/Files/qanholas/SPGen_ReleaseCandidate1_Binaries.zip ---- Dropping stored procedure sp_费用表_SelectAll : --IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id OBJECT_ID(N[sp_费用表_SelectAll]) AND OBJECTPROPERTY(id, NIsProcedure) 1)DROP PROCEDURE [dbo].[sp…

LeetCode 121:买卖股票的最佳时机 思考分析

题目描述&#xff1a; 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易&#xff08;即买入和卖出一支股票一次&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。 注意&#xff1a;你不能在买入股票前卖出…

四、规则组织的衍生组织——经向破斜组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 经向破斜组织图&#xff1a; 左半部分&#xff1a;&#xff0c;3上2下1上2下&#xff0c;右斜&#xff0c;飞数为1 右半部分&#xff1a;&#xff0c;2上1下2上3下。左斜&#xff0c;飞数为-1 左右两部分&#xff0c;经纬纱组织…

【数据结构基础】【散列表】

散列表也叫做哈希表(hash table),这种数据结构提供了键(key)和值(value)的映射关系。只要给出一个key&#xff0c;就可以高效查找它匹配的value&#xff0c;时间复杂度接近O(1); 哈希函数 哈希函数通过某种方式&#xff0c;把key和数组下标进行转换。 在java中&#xff0c;每…

VisualStudio运行C++项目检测include<stdio.h>报错解决方案

一、项目—>属性 二、将SDL检查更改为否即可

信息设计中的“父子关系”

交互设计工作核心在于信息架构和交互细节设计。信息架构包括信息分类以及信息展示逻辑设计&#xff1b;交互细节则多表现为控件的选择&#xff0c;交互效果的定义等。在信息设计中&#xff0c;遇到最棘手的问题就是信息量太多而显得设计结果不尽人意&#xff0c;那么在砍不掉需…

[Object-oriented] : 控制反转

前言 : 参加点部落的活动&#xff0c;关于IoC(控制反转)大家有很多的讨论。本文排除对象生成的部份&#xff0c;单纯解释IoC为甚么叫做控制反转。本篇文章以之前写的 [Object-oriented] : 重用内容来举例。 未IoC之前的对象图 : 很明显的左边的组件A&#xff0c;相依右边的组件…

二、规则组织数学模型的建立

一、规则组织数学模型的建立 规则组织满足两个不变&#xff1a;1&#xff0c;组织点运动规律不变、2&#xff0c;飞数不变的单系统组织 即&#xff1a;若知道组织点运动规律和飞数即可确定唯一一个组织。 3上2下&#xff0c;组织循环数为325&#xff0c;经纱循环数纬纱循环数…

LeetCode 3:无重复字符的最长子串 思考分析

给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&#x…

美国人看见的是友情,中国人看见的是忠诚

美国人看见的是友情&#xff0c;中国人看见的是忠诚 这是一个人狗情未了的感人事件。 一个即将死去的人&#xff0c;总有未了的心愿难以割舍&#xff0c;来自美国的凯文麦克莱恩实现了他的临终愿望&#xff0c;而他的最后愿望就是与自己的爱犬见上最后一面。 现年57岁的凯文麦克…

PyCharm安装及配置

一、下载PyCharm和相关工具 qoi8 二、安装PyCharm 先不要运行PyCharm 三、将jar包放到PyCharm安装目录的bin文件夹下 三、找到pycharm64.exe.vmoptions和pycharm.exe.vmoptions配置文件 四、编辑这两个文件&#xff0c;在这两个文件最后一行加入下载好的jar包文件路径 -ja…

LeetCode 239:滑动窗口最大值 思考分析

给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 你能在线性时间复杂度内解决此题吗&#xff1f; 示例: 输入: num…

计算机论文范文1500,电子商务毕业论文范文1500字

电子商务毕业论文范文1500字时间稍纵即逝&#xff0c;充满意义的大学生活即将结束&#xff0c;毕业前要通过最后的毕业论文&#xff0c;毕业论文是一种有计划的检验学生学习成果的形式&#xff0c;那么问题来了&#xff0c;毕业论文应该怎么写&#xff1f;下面是小编为大家整理…

五、规则组织的衍生组织——纬山形组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 纬山形组织图&#xff1a; 观察可知&#xff1a;纬山形组织图下半部分是右斜组织&#xff0c;上半部分是左斜组织。右斜和左斜按照垂直方向进行排列。 该图是一个2上3下2上1下(从最下面一行从左往右观看) 特点&#xff1a;每一…

剑指 Offer 57 - II. 和为s的连续正数序列 思考分析

输入一个正整数 target &#xff0c;输出所有和为 target 的连续正整数序列&#xff08;至少含有两个数&#xff09;。 序列内的数字由小到大排列&#xff0c;不同序列按照首个数字从小到大排列。 示例 1&#xff1a; 输入&#xff1a;target 9 输出&#xff1a;[[2,3,4],[4…