1.初始化

在C++中,初始化与赋值操作是完全不同的两个操作。初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替。

初始化的方式有:

1 int test = 0;
2 int test = {0};
3 int test{0};
4 int test(0);

第3行这种使用花括号初始化的方式被称为列表初始化(C++11新标准)。而从第2行中可以看出,赋值操作也可以采用一组由花括号括起来的初始值来完成。而采用这种初始化的方式的好处在于,在出现初始化操作存在丢失信息的风险时,编译器会进行警告,而另外两个却不会。当然,这必须是在初始化内置类型变量的情况下。

而所谓的丢失信息,譬如将一个占8字节类型的变量赋值给一个占4字节类型的变量时就会存在此类风险。

如果定义变量时没有指定初始值,则变量被默认初始化。堆中的内置变量被初始化为0,栈中的内置变量不被初始化、即其值未定义。类的对象未初始化,则其值由类确定。

类的值其实等同于类内各个成员的值,则上句话的意思就是,如果类的对象没有被初始化,则让编译器去类的定义中看看有没有提供类内初始值(C++新标准),有就照办,没有就别管。

2.引用

引用实质就是为对象起了一个别名而已。引用必须初始化!

int test1 = 0;
int &test2 = test1;

此时对test2操作就等同于对test1操作。引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。而且,引用的类型必须与其所引用的对象的类型一致,但是有两种例外:

第一种情况是在初始化常量引用时允许将结果能转换成引用类型的任意表达式作为初始值。

第二种情况是派生类引用向基类引用的自动类型转换。

3.const限定符

默认情况下,const对象仅在文件中有效。而想要实现只在一个文件中定义const对象,在其他多个文件中声明使用它,则需要该对象声明与定义都添加extern关键字。顶层const、底层const不过就是指针常量和常量指针。

4.constexpr和常量表达式

常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。

将你认为是常量表达式的变量声明为constexpr类型(C++新标准),以便由编译器检查变量的值是否是常量表达式。声明的constexpr变量一定是一个常量,而且必须使用常量表达式初始化。值得注意的是: 定义一个constexpr类型的指针,限定符constexpr只对指针有效,与指针所指对象无关!

1 const int *p = nullptr; //p是一个指向整型常量的指针
2 constexpr int *q = nullptr; //q是一个指向整型的常量指针

5.类型别名

typedef与C语言一致。

C++有一种新的方法,别名声明。使用关键字using。

using pstring = char *;

其他特性与typedef一致。

值得注意的是类型别名不能像宏定义一样去直接替换理解,而应该将新生成的别名当做是一个新类型去理解。

1 using pstring = char *;
2 const pstring ps1 = nullptr; //指向char的常量指针
3 const char *ps2 = nullptr; //指向const char的指针

显而易见,2、3行表达意义不同。

6.auto类型说明符

auto类型说明符(C++新标准)能让编译器通过初始值来推算出变量的类型。显然,auto类型的变量必须有初始值。

int  test = 0;
auto index = test; //index为int类型变量

要注意的是当使用auto在一条语句中声明多个变量时,所有变量的初始基本数据类型必须一致,因为一条语句中只能有一个基本数据类型。

7.decltype类型指示符

decltype类型指示符(C++新标准)可以返回操作数的类型(包括引用及顶层const)。

const int test1 = 0;
const int& test2 = test1;
decltype(test1) x = 0; //x类型为const int
decltype(test2) x = test1; //x类型为const int&

要注意的有两点:

第一点,如果表达式内容是解引用操作,则decltype将得到引用类型。

第二点,如果给操作变量加上一层或多层括号,则decltypr将得到引用类型。

8.编写自己的头文件

类通常被定义在头文件中,所在头文件名字与类名一致。

为了防止头文件被重复包含,采用预处理功能头文件保护符来进行规避。

man.h

1 #ifndef MAN_H
2 #define MAN_H
3 #include <string>
4 class man {
5 std::string name;
6 unsigned int age;
7 };
8 #endif

【C++基础学习】类型声明的更多相关文章

  1. typescript学习笔记(一)---基础变量类型

    作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...

  2. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  3. TypeScript基础类型,类实例和函数类型声明

    TypeScript(TS)是微软研发的编程语言,是JavaScript的超集,也就是在JavaScript的基础上添加了一些特性.其中之一就是类型声明. 一.基础类型 TS的基础类型有 Boolea ...

  4. HTML&CSS基础学习笔记1.4-定义文档类型

    Web 世界中存在许多不同的文档.只有了解文档的类型,浏览器才能正确地显示文档. HTML 也有多个不同的版本,只有完全明白页面中使用的确切 HTML 版本,浏览器才能完全正确地显示出 HTML 页面 ...

  5. C#类型基础——学习笔记一

    1.C#中的类型一共分两类,一类是值类型,一类是引用类型.2.结构类型变量本身就相当于一个实例.3.调用结构上的方法前,需要对其所有的字段进行赋值.4.所有元素使用前都必须初始化.5.(结构类型)ne ...

  6. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  7. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  8. python入门到精通[三]:基础学习(2)

    摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...

  9. C#/.NET 基础学习

    初识C# C#是微软公司发布的面向对象的.运行于.NET Framework之上的高级程序设计语言.与Java有着明显不同,借鉴Delphi的特点,与COM(组件对象模型)直接集成,是微软公司 .NE ...

  10. 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)

    前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...

随机推荐

  1. html css的简单学习(三)

    html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...

  2. MinGW 创建的程序或 DLL 脱离 libgcc-xx-xx.dll 和 libstdc++-x.dll 运行库的方法

    MinGW 沿袭了 Linux 下 gcc/g++ 的习惯,编译出的程序或者动态链接库(共享库)总是默认采用动态链接方式,需要系统中附带运行时库文件 libgcc-xx-xx.dll 和 libstd ...

  3. hdu3947 给一些已知(需费用)路径去覆盖一些边 //预先加灌法费用流

    River Problem 题意:一个有向树(河流),只有一个汇点1,每条边只有一个出度.有些河道有污染指数xi,必需要治理,有m段路径,可以去覆盖这些,每被覆盖一次,xi降低响应值. :即 给出一些 ...

  4. hdu 1787(欧拉函数)

    GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. 空间划分的数据结构(网格/四叉树/八叉树/BSP树/k-d树/BVH/自定义划分)

    目录 网格 (Grid) 网格的应用 四叉树/八叉树 (Quadtree/Octree) 四叉树/八叉树的应用 BSP树 (Binary Space Partitioning Tree) 判断点在平面 ...

  6. Java创建和解析Json数据方法(三)——json-lib包的使用

    (三)json-lib包的使用         这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...

  7. Jenkins使用Pipeline插件实现多个Job之间的串并联(教程收集)(待实践)

    在原始不使用插件时,在Jenkins我们要实现多个Job之间的连续集成时,我们一般的做法就是在每个Job上关联另一个Job,但是,这样做有个弊端,只能是连续的,如果要实现串或并联这样的,估计比较难:但 ...

  8. iOS开发 解决使用AVAudioRecorder录制后转mp3解决音量小的问题

    使用AVAudioRecorder录音后使用avplayer播放声音小,录音完后转成mp3格式的音频声音也小!!! 老板要求最基本的是不用把手机放到耳边听! 在StackOverFlow上查了一下,加 ...

  9. Tensorflow 之 TensorBoard可视化Graph和Embeddings

    windows下使用tensorboard tensorflow 官网上的例子程序都是针对Linux下的:文件路径需要更改 tensorflow1.1和1.3的启动方式不一样 :参考:Running ...

  10. poj 1651 Multiplication Puzzle【区间DP】

    题目链接:http://poj.org/problem? id=1651 题意:初使ans=0,每次消去一个值,位置在pos(pos!=1 && pos !=n) 同一时候ans+=a ...