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. LeetCode OJ-- Restore IP Addresses

    https://oj.leetcode.com/problems/restore-ip-addresses/ string到int的ip地址格式化. 分别用 i+1,j+1,k+1,表示前三个地址段的 ...

  2. python学习之-- 生成唯一ID

    以下以2种方法生成唯一ID def uuid_method(): """第一种方法""" import uuid return str(uu ...

  3. [笔记][FPGA]如何使用SignalTap观察wire与reg值

    0. 简介 在FPGA程序调试时,我们除了仿真还经常的会用到SignalTap进行板级调试,其可以真实有效的反应某些变量的变化,方便我们理解内在跳转,方便Debug的运行.SignalTap需要制定时 ...

  4. 湖南集训day2

    难度:☆☆ /*显然可以前缀和*/ #include<iostream> #include<cstdio> #include<cstring> #define N ...

  5. 预防SQL注入笔记

    SQL注入如何预防? 本文参考自owasp,重点是提供清晰,简单,可操作的指导,以防止应用程序中的SQL注入漏洞.不幸的是,SQL注入攻击很常见,这是由于两个因素: SQL注入漏洞的显着流行 目标的吸 ...

  6. Nessus虚拟机的几个问题解决办法

    1.使用ppp的校园网或者家庭宽带无法通过桥接上网. 这时要把这俩网卡变成NAT模式就行. 2.国外下载插件包(或者过慢). 我这里贡献个高速链接.base64,懂得自然懂. c3NyOi8vTkRj ...

  7. android特效集合

    https://github.com/Trinea/android-open-project http://www.cnblogs.com/hawkon/p/3593709.html http://i ...

  8. [Algorithms] Tree Data Structure in JavaScript

    In a tree, nodes have a single parent node and may have many children nodes. They never have more th ...

  9. git 强制覆盖,分支合并

    强制合并 git fetch --all && git reset --hard origin/master && git pull 合并代码 git commit - ...

  10. 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

    原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...