【C++】C++中typedef、auto与decltype的作用
typedef
类型别名(type alias)是一个名字,使用typedef不会真正地创建一种新的数据类型,它只是已经存在数据类型的一个新名称。
语法:
typedef type name;
其中type是c++中的数据类型,name是这个类型的一个别名。
C++11提供了引用的功能,关于引用的详细介绍可以参考笔者之前的文章。引用为变量提供别名,typedef则是为类型提供别名。
例如:
#include <iostream>
int main(){
int m = ;//使用int定义变量m
typedef int integer;//创建一个int的别名为integer
integer n = ;//使用integer定义变量n
typedef integer integer_type;//创建一个integer的别名为integer_type
integer_type o = ;//使用integer_type定义变量o
std::cout << "m + n + o = " << (m+n+o) << std::endl;//运算
return ;
}
输出结果:
m + n + o = 60
上面有两个别名integer和integer_type,integer_type有integer创建而来,integer_type和integer都是属于int类型。
c++11还为提供别名提供了另一种更为简便的方法—别名声明(alias declaration),例如:
using integer = int; // integer是int的同义词
这种方法的规则是用using关键字作为别名的开始,其后紧跟别名和等号。
auto
auto是c++11标准定义的一个类型推断的关键字,auto能够让编译器自动去分析表达式所属的类型,与特定的数据类型不同(比如double),让编译器通过初始值来推算变量的类型。显然auto定义必须有初始值。
比如:
#include <iostream>
#include <typeinfo>
#include <set>
using namespace std; int main()
{
auto x = ;
auto y = 3.37;
auto ptr = &x;
cout << "x type is : " << typeid(x).name() << endl
<< "y type is : " << typeid(y).name() << endl
<< "ptr type is : " << typeid(ptr).name() << endl; cout << "--------------------------" << endl; set<string> strs;
strs.insert({"green","blue","red"});
for(auto it = strs.begin();it != str.end();it++){//遍历容器中的元素
cout << *it << " ";
} cout << "--------------------------" << endl; //r是一个int引用类型
auto &r = x;
cout << "r type is : " << typeid(r).name() << endl; return ;
}
输出结果:
x type is : i
y type is : d
ptr type is : Pi
--------------------------
blue green red
--------------------------
r type is : i
上面的i表示int,d表示double,Pi表示int*(int类型的指针)。
decltype
decltype也是c++11提供的一个关键字,它可以从变量或表达式中提取类型。
int f() { return ; }
int main(){
decltype(f()) val;//f()返回值是int类型,val是int类型
const int &v = ;
decltype(v) rval;//错误,rval 是引用类型,必须要初始化
int pv = ;
int *p = &pv;
decltype(p) pp;//正确,pp是int*类型。
decltype(*p) c;//错误,c是int&类型(int引用类型),必须要初始化
return ;
}
如果表达式是解引用操作(*),那么decltype将会得到引用类型。如上面的decltype(*p)。
如果decltype里面有两个括号,那么是一个引用类型
decltype((i)) d;//错误,d是int&,必须要初始化。
decltype(i) e;//正确,e是一个(未初始化)int。
注意:
decltype((variable))(注意是双括号)的结果永远是引用,而decltype(variable)结果只有当variable本身是引用时才是引用。
【C++】C++中typedef、auto与decltype的作用的更多相关文章
- [转]引用模板类中定义的类型(用typedef或using)以及auto、decltype、typename的使用
一.背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名. 最近在写c++代码的时 ...
- C++ 处理类型名(typedef,auto和decltype)
随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面.一是一些类型难于"拼写",它们的名字既难记又容易写错,还无法明确体现其真实目的和含义.二是有时候根本搞不 ...
- C++ 11 学习1:类型自动推导 auto和decltype
Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...
- auto与decltype
今天搜狗笔试的一道选择题,原题给忘了,但记得所考的知识点.知识点很基础,但很容易忽视. 具体内容可参考C++ Primer. auto :变量取auto后,其所对应的类型 auto一般会 ...
- C语言中关键字auto、static、register、const、volatile、extern的作用
原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.exter ...
- c++11 auto 与 decltype 详解
转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题 ...
- 【C++】C++11的auto和decltype关键字
转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...
- C++11新特性— auto 和 decltype 区别和联系
一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准 ...
- C++ 11 新特性: auto 和 decltype 区别和联系
一. auto简介编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就 ...
随机推荐
- HDU 2196 Computer (树上最长路)【树形DP】
<题目链接> 题目大意: 输出树上每个点到其它点的最大距离. 解题分析: 下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况. dp[i][0] : 表示以i为根的子树中的结点与 ...
- [ 高危 ] my网任意账户登陆
该网站的任意登录其实都已经提交得差不多了,本来以为这个漏洞会是一个重复的,然而试了一下发现思路奇葩. 任意登录,一般都为验证码爆破,4位手机验证码,而用于拦截的图片验证码没有或者可以重复使用,所以就能 ...
- AS安装过程中出现的错误
1.首先是You may need to adjust the proxy settings in Gradle.的错误, 主要是看你有没有图中红线所画的gradle的压缩包 如果没有,那就前往htt ...
- Python virtualenvwrapper在Win下的安装和管理
安装: 在Win下安装wrapper的时候,需要安装一个特殊的版本,即virtualenvwrapper-win.如果安装的只是virtualenvwrapper,则会出现mkvirtualenv,l ...
- 蓝桥杯 ——无重复组合——C++
问题描述: 求任意长度的(ABCD.....)全部n=0,1,2 ....组合情况(n小于等于串的长度) 解决思路: 如果串的长度固定,n的值固定循环嵌套 在这里以深度优先形成一棵树,如下图: 源代码 ...
- koa2框架设置响应和请求头
https://koa.bootcss.com/#response 请耐心翻到网页下端,可以看到 设置响应头: ctx.set('Content-Type', 'application/zip') 添 ...
- [HDU1693]Eat the Trees
Description: 给出n*m的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路.问有多少种铺法? Hint: \(n,m<=12\) Solution: 与原来单回路那题转移 ...
- 老毛桃UEFI版u盘启动盘
使用老毛桃制作UEFI启动盘 下载UEFI版本启动盘制作工具,打开官方网站http://www.laomaotao.org,当前显示页面右下下载UEFI版本.文章写作时最新版本为9.3. 使用教程见: ...
- [P4995]跳跳!(贪心)
这应该是我做过的最简单的洛谷月赛了 题意 给你n个高度,你的初始高度是0,现在要求你遍历每一个高度,每一次遍历耗费(hi−hj)2 的值 现在要你求耗费值最大 思路 真的是水…… 排序一下,求一下就好 ...
- 2017.08.15【NOIP提高组】模拟赛B组
Summary 今天比赛很差很差,掉到谷底.第一题快排打错了,漏了递归,变成一个while循环.最后一题k忘记减一,答案一直是无穷大,所以没交.第三题没时间调DP就打了个递归,第二题状态想歪了.四道题 ...