【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,一经查实,立即删除!

相关文章

.net romoting 的EventWrapper类

.net romoting 的EventWrapper类 注意&#xff1a;防火墙的问题 --------------------------------------------------- //定义广播服务接口 [Serializable] public delegate void BroadCastEventHandler(string info); public interface IBroadCastService {…

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

一、织物形成的五大运动&#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;项目跑起来&…

java类只读怎么办_如何在Java中制作一个只读类?

java类只读怎么办The question is that "can we make a read-only class in Java?" 问题是“我们可以用Java制作一个只读类吗&#xff1f;” The answer is: "Yes, we can make a read-only in java." 答案是&#xff1a; “是的&#xff0c;我们可以在J…

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

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

NHibernate 的 ID 标识选择器

在 Hibernate 中&#xff0c;每个对象需要一个标识 ID&#xff0c;通过这个标识 ID 建立对象与数据库中记录的对应关系。 Nhibernate 提供了多种方式来建立这个 POID。基于不同的生成策略&#xff0c;可以选择更佳的方式。 首先是赋值方式&#xff1a;assigned&#xff0c;这种…

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

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

c语言 函数的参数传递示例_scalbln()函数以及C ++中的示例

c语言 函数的参数传递示例C scalbln()函数 (C scalbln() function) scalbln() function is a library function of cmath header. It scales the significand using floating-point base exponent (long int) i.e. it is used to calculate the product of the given signific…

上周热点回顾(7.8-7.14)

热点随笔&#xff1a; MingQQ v1.0高仿版开源了&#xff0c;使用WebQQ协议实现了QQ客户端基本的聊天功能...&#xff08;ZYM&#xff09; 我的新书&#xff0d;&#xff0d;《从员工到经理人》&#xff08;Jimmy Zhang&#xff09; MVC实用架构设计&#xff08;三&#xff0…

储存过程生成器

/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…

基于计算机控制的温度检测系统,基于专用温度传感的温度检测系统.doc

基于专用温度传感的温度检测系统摘 要 在现代工业领域温度检测系统是指用某种方式显示出当前的环境温度。传统使用PTC或NTC电阻作为温度传感器的方式在使用过程中存在着很多不足之处比如所采集温度的精度比较低、系统的可靠性差、设计难度较大、整体设计成本较高等缺点已…

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;经纬纱组织…

EASYUI+MVC4通用权限管理平台

通用权限案例平台在经过几年的实际项目使用&#xff0c;并取得了不错的用户好评。在平台开发完成后&#xff0c;特抽空总结一下平台知识&#xff0c;请各位在以后的时间里&#xff0c;关注博客的更新。 1.EASYUIMVC4通用权限管理平台--前言 2.通用权限管理平台--架构选型 3.通用…

int max+1小于0_INT_MAX常数,C ++中的示例

int max1小于0C INT_MAX宏常量 (C INT_MAX macro constant) INT_MAX constant is a macro constant which is defied in climits header, it is used to get the maximum value of a signed int object, it returns the maximum value that a signed int object can store, wh…

在计算机领域客观事物的属性表示为数据,数据与信息试题解析

一图看懂数据与信息1、在计算机领域&#xff0c;信息是经过转化而成为计算机能够处理的__________。A&#xff0e;数据B&#xff0e;符号C&#xff0e;图形D&#xff0e;数字答案&#xff1a;A。解析&#xff1a;本题考查有关信息基本概念的知识。信息是人们由客观事物得到的。…

Mysql Data 目录和 Binlog 目录 搬迁

Mysql5.1.38 Data 目录和 Binlog 目录 搬迁 [mysql-bin.index not found (Errcode: 2)]Leave a comment Go to comments刚开始安装时使用了默认目录&#xff0c;使用一段时间&#xff0c;数据慢慢变在&#xff0c;发现当前设置的目录空间不够时&#xff0c;就要搬迁数据到另一个…

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

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

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

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