字符类型

 #include <iostream>

 using namespace std;

 int main()
{
cout << '' + << endl;
cout << static_cast<char>('' + ) << endl; return ;
}

运行结果:

注意类型转换

再谈auto

1、在使用auto自动推断变量类型时,没有必要采用列表初始化“{}”的方式,而是直接用“=”就好了

2、在较小的作用域中建议优先使用auto

 template<class T> void f1(vector<T> & arg)
{
for (vector<T>::iterator p = arg.begin(); p != arg.end(); ++p) {
* p =;
} for (auto p = arg.begin(); p != arg.end(); ++p) {
* p =;
}
}

很明显,第二种方法要好,第一书写要少,第二如果把vector改为了list,第二种方法也能适配

再谈列表初始化

以vector来举例

vector<int> v1 {}; //v1包含1个元素,该元素值为99
vector<int> v2 (); //v2包含99个元素,每个元素都取默认值0
vector<string> v1 {"hello"}; //v1含有1个元素,该元素值为"hello"
vector<string> v2 ("hello"); //错误:vector的任何构造函数都不接受字符串字面值常量作为参数

因此,除非有充分的理由,否则最好使用{}初始化

下面再给出一些例子:

 int x4 {}; //x4被赋值为0
double d4 {}; //d4被赋值为0.0
char buf[] {}; //对于任意i,buf[i]的值为0
char * p {}; //p被赋值为nullptr
int * p {new int{}}; //* p的值变为10
char * q {new char[] {}}; //对于任意i,q[i]的值变为0
vector<int> v4 {}; //v4被赋值为一个空向量
string s4 {}; //s4被赋值为""

decltype

1、decltype意义

有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

2、decltype用法

(1)基本用法

 int getSize();

 int main(void)
{
int tempA = ; /*1.dclTempA为int*/
decltype(tempA) dclTempA;
/*2.dclTempB为int,对于getSize根本没有定义,但是程序依旧正常,因为decltype只做分析,并不调用getSize,*/
decltype(getSize()) dclTempB; return ;
}

(2)与const结合

    double tempA = 3.0;
const double ctempA = 5.0;
const double ctempB = 6.0;
const double *const cptrTempA = &ctempA; /*1.dclTempA推断为const double(保留顶层const,此处与auto不同)*/
decltype(ctempA) dclTempA = 4.1;
/*2.dclTempA为const double,不能对其赋值,编译不过*/
dclTempA = ;
/*3.dclTempB推断为const double * const*/
decltype(cptrTempA) dclTempB = &ctempA;
/*4.输出为4(32位计算机)和5*/
cout<<sizeof(dclTempB)<<" "<<*dclTempB<<endl;
/*5.保留顶层const,不能修改指针指向的对象,编译不过*/
dclTempB = &ctempB;
/*6.保留底层const,不能修改指针指向的对象的值,编译不过*/
*dclTempB = 7.0;

(3)与引用结合

    int tempA = , &refTempA = tempA;

    /*1.dclTempA为引用,绑定到tempA*/
decltype(refTempA) dclTempA = tempA;
/*2.dclTempB为引用,必须绑定到变量,编译不过*/
decltype(refTempA) dclTempB = ;
/*3.dclTempC为引用,必须初始化,编译不过*/
decltype(refTempA) dclTempC;
/*4.双层括号表示引用,dclTempD为引用,绑定到tempA*/
decltype((tempA)) dclTempD = tempA; const int ctempA = , &crefTempA = ctempA; /*5.dclTempE为常量引用,可以绑定到普通变量tempA*/
decltype(crefTempA) dclTempE = tempA;
/*6.dclTempF为常量引用,可以绑定到常量ctempA*/
decltype(crefTempA) dclTempF = ctempA;
/*7.dclTempG为常量引用,绑定到一个临时变量*/
decltype(crefTempA) dclTempG = ;
/*8.dclTempH为常量引用,必须初始化,编译不过*/
decltype(crefTempA) dclTempH;
/*9.双层括号表示引用,dclTempI为常量引用,可以绑定到普通变量tempA*/
decltype((ctempA)) dclTempI = tempA;

(4)与指针结合

    int tempA = ;
int *ptrTempA = &tempA;
/*1.常规使用dclTempA为一个int *的指针*/
decltype(ptrTempA) dclTempA;
/*2.需要特别注意,表达式内容为解引用操作,dclTempB为一个引用,引用必须初始化,故编译不过*/
decltype(*ptrTempA) dclTempB;

3、decltype总结

decltype和auto都可以用来推断类型,但是二者有几处明显的差异:

(1)auto忽略顶层const,decltype保留顶层const;

(2)对引用操作,auto推断出原有类型,decltype推断出引用;

(3)对解引用操作,auto推断出原有类型,decltype推断出引用;

(4)auto推断时会实际执行,decltype不会执行,只做分析。

ps:关于auto和decltype,后续再详细补充

本文部分参考自:

http://www.cnblogs.com/cauchy007/p/4966485.html

C++程序设计(第4版)读书笔记_类型与声明的更多相关文章

  1. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  2. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  3. Primer C++第五版 读书笔记(一)

    Primer C++第五版 读书笔记(一) (如有侵权请通知本人,将第一时间删文) 1.1-2.2 章节 关于C++变量初始化: 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义 ...

  4. 单元测试之道Java版——读书笔记

    单元测试知道Java版读书笔记 首先我们必须要知道我们所写的代码,它的功能是什么,如果我们不了解代码的行为,那么也就无从测试. 我们测试的目的,是为了我们整个程序架构的稳定,代码其实就是欧文要实现功能 ...

  5. C++程序设计(第4版)读书笔记_指针、数组与引用

    void * 函数指针和指向类成员的指针不能被赋给void * 字符串字面值常量 #include <iostream> using namespace std; void f() { c ...

  6. 新标准C++程序设计读书笔记_类和对象

    面向对象的程序设计方法 抽象:将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性):将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构 ...

  7. 新标准C++程序设计读书笔记_继承和多态

    简单继承的例子: #include <iostream> #include <string> using namespace std; class CStudent { pri ...

  8. 新标准C++程序设计读书笔记_运算符重载

    形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...

  9. 《细说PHP》第二版--读书笔记

    第五章 PHP的基本语法 5.2.4 在程序中使用空白的处理 5.3 变量 5.3.1 变量的声明 在php中变量的声明必须是使用一个$符号,后面跟变量名来表示 unset()函数释放指定变量 iss ...

随机推荐

  1. [CodePlus2017NOV]晨跑

    题目大意: 三个人分别以a,b,c的速度在一个圈上晨跑,在时间为0时,他们一起出发,问何时能相遇? 思路: lcm(a,b,c)即可. #include<cstdio> #include& ...

  2. Java高级架构师(一)第18节:X-gen所需service、web层模板

    以X-gen的Controller为例: package $#modulePackge#.web; import org.springframework.beans.factory.annotatio ...

  3. flask 开发环境搭建

    window下: 1)安装python 2)安装pip 3)使用pip install flask 如果成功安装使用pip list 既可以查看到flask的版本 ubuntu下的环境搭建 同样地使用 ...

  4. Java杂谈4——Java中的字符串存储

    Java中的String Java.Lang.String是Java语言自带的字符串实现,它并不是java的基本类型,但却和几乎每个java程序都密切相关的一个基础java类. string类内部实际 ...

  5. Coherence代理的负载均衡

    Coherence在extend模式下,proxy的负载均衡机制官方解释是 Extend client connections are load balanced across proxy servi ...

  6. git rebase、git merge、git cherry-pick 使用详解

    1.git cherry-pick 是合入其他分支的某一次或者几次提交(cherry-pick是挑选的意思):把其他分支的某些功能合入当前分支 2.git merge 把其他分支合入当前分支,一般用作 ...

  7. OpenGL.Vertex Array Object (VAO) [转]

    http://www.cppblog.com/init/archive/2012/02/21/166098.html 一 OpenGL抛弃glEnable(),glColor(),glVertex() ...

  8. 最简单的PHP socket

    服务端 <?phperror_reporting(E_ALL);set_time_limit(0); $ip = "127.0.0.1";$port = 1935; func ...

  9. PHP测试用例-前言 1

    前提知识准备 在学习本课程之前,你需要准备以下知识点: 掌握一般的PHP开发技能,使用面向对象的框架开发过三个月以上 会一些JS知识 了解http协议 拥有以下知识会学得更加顺利: 掌握PHPUnit ...

  10. Linux文件夹、分区

    必须明确,硬盘分区的存在,是由硬盘的物理特性决定的,不会因为操作系统的不同而有所改变 所以不用对为根目录/挂载分区的同时还为/usr挂载分区感到惊讶   ====分区的概念==== 可以把一个硬盘比成 ...