C++primer(第五版)第二章(变量和基本类型)

news2024/11/23 3:26:34

2.1基本内置类型

2.1.1算术类型

C++的基本内置类型包括算数类型和空类型,空类型就是void,算术类型我从原书中截下来放在下面:

从上表我们可以得知C++规定int至少和short一样大,long至少和int一样大,longlong至少和long一样大.

其中char(字符)类型支持国际化,所以char会确保可以放下任意字符对应的数字值,char的大小和一个机器字节一样.

在类型名前加上 unsigned 可以得到对应的无符号类型,例如 int 为整型, unsigned int 为无符号整型,无符号类型不能为负数.

书中推荐当明确知道数值不会为负数时,选用无符号类型.

当使用int做运算时,若范围有可能超过int,那么则选用longlong而不是long,以为long的取值范围有可能和int是一样的.如果用到的整数是一个不大的,那么可以选用 unsigned char 或是 signed char (以前我玩单片机的时候会为了节约内存把 int 改用为 unsigned char ).

2.1.2类型转换

不能给一个无符号的对象赋一个负值,正常人都不会这么干,但是我们有可能在做运算的时候把无符号操作成负数,这是应当注意和避免的.

书中提示不要混用带符号类型和无符号类型.

2.1.3字面量常量

C++中包含的转义字符如下:

虽然它看起来有两个字符,但转义字符被当作一个字符使用(即一个char).

给对象赋值时,若给出一个小数,那么默认为double类型,单引号包裹的内容默认为字符类型,双引号包裹的内容默认为字符串类型……通过添加字面量前缀或后缀可以改变字面量的默认类型:

 如果使用long类型时,后缀使用L,因为小写的l会和数字1混淆.

2.2变量

2.2.1变量定义

C语言中没有string字符串类型,C++中的string类型完整的写法是std::string,因为string是在命名空间std中定义的,目前只需要知道string是一种表示可变长字符序列的数据类型即可.

在C++中初始化和赋值是两种完全不同的操作,初始化是创建变量时赋予一个初始值,赋值则是把对象当前的值擦除,用一个新值来替代.

C++中初始化有好几种不同类型,以下四种方式都可以将整型变量初始化为0;

int a=0;        //我最常用
int b={0};
int c{0};
int c(0);

在C++11新标准中,使用花括号{}来初始化变量得到全面应用(包括vector在内的各种容器都可以使用花括号来初始化),这种方式被称为列表初始化.

2.2.2变量声明和定义的关系

C++支持分离式编译机制(就是分文件编写),为了支持这一特性,C++中声明与定义区分.声明使得名字为程序所知,定义负责创建与名字(名字这个概念在书中反复被提到)关联的实体.

如果想声明一个变量但不定义,则在变量名前添加关键字 extern,而且不要显式地初始化变量,任何包含显式初始化的声明都为定义.在函数体内部如果试图初始化一个有extern标记的变量将会引发错误.变量只能被定义一次,但可以被多次声明.

extern int i;    //声明i但没定义
int i;           //声明i并且定义

2.2.3标识符

书中建议的变量命名规范如下(个人命名标识符喜欢驼峰命名法):

2.2.4名字的作用域

作用域是程序的一部分,C++中大多数作用域用花括号{}来分隔.同一个名字在不同的作用域可能指向不同的实体.名字的有效区域始于命名语句,结束与命名语句所在的作用域结尾.main函数定义与所有花括号外,其他与main一样定义在函数体之外的名字都拥有全局作用域,即整个程序都可以使用.函数内部不推荐使用和全局变量同名的变量,如果真的用到了同名的变量,则优先使用内部的变量(就近原则),但容易混淆.

2.3复合类型

2.3.1引用

引用的全称是"左值引用".定义引用时,程序把引用和它的初始值绑定在一起,引用即是别名,引用绑定后,修改绑定即是修改原值.引用并非对象,它只是为一个已经存在的对象所起的另一个名字.由于引用本身不是对象,所以不能定义引用的引用,并且一般情况下引用的类型要和所绑定的类型严格匹配.

2.3.2指针

指针存放的是对象的地址,初始化指针时,可以用取地址符号(&)来给指针赋值,也可以用解引用符(*)(解引用符只适用于已经明确指向了某个对象的有效指针)来访问指针所指向的值.由于引用不是对象,所以不能定义指向引用的指针.一般情况下指针的类型要和它指向的对象保持类型一致(这一点和引用一样)

 定义空指针有以下几种方法(暂时不懂指针该指向哪里的时候就初始化为空指针)

int *p=nullptr;
int *p=0;
int *p=NULL;    //这种方法需要#include<cstdlib>

最常用的并且推荐的是使用nullptr(C++11新标准),不推荐使用NULL.

void*是一种特殊的指针类型,可以用于存放任意对象的地址.

2.4const限定符

const修饰的对象为常量,创建后,值不能再修改,所以const对象必须初始化.

2.4.1const的引用

const修饰引用,我们称之为对常量的引用,与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象.

2.4.2指针和const

与引用不同的是指针是一个对象,所以指针本身可以被const修饰变成指针常量,指针常量不能修改指向.

const int *p;    //不能改变所指向的地址指向的值
int *const p;    //不能改变指向

2.4.3顶层const

顶层const可以表示任意的对象是常量.底层const则与指针和引用等复合类型的基本类型部分有关.

我个人的理解是const修饰的是常量则为顶层const,const修饰的间接指向常量则为底层const.书中简单提了一下顶层const和底层const的这个概念(后续还会出现,想详细了解的可以查看原书或者去百度),我觉得挺绕的.

2.4.4constexpr

C++11新标准规定,允许将变量声明为constexpr类型以便编译器验证变量的值是否为常量表达式,所以声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化.我不太懂这个的用法,但是书中说:

 一个constexpr指针的初始值必须为nullptr或者0;

2.5处理类型

2.5.1类型别名

 变量可以用引用来起别名,类型也可以有别名,有两种方法,第一种是传统的关键字typedef,第二种是别名声明:

typedef int MYINT;    //MYINT是int的别名(方法一,C语言中也是如此)
using MYINT = int     //MYINT是int的别名(方法二,C++11新标准)

2.5.2auto类型说明符

C++11新标准引入auto类型说明符,可以当作数据类型使用,而它具体是什么数据类型是编译器由初始值判断的,所以auto类型的变量必须有初始值.

2.5.3decltype类型指示符

C++11新标准引入decltype,可以返回操作数的数据类型.使用时在括号中放入具体的值,然后编译器由值来判断具体数据类型,这点和auto类型,但decltype可以使得变量不必初始化而仅仅是声明

decltype(1) a;        //a的类型为int
decltype('a') b;      //b的类型为char
decltype(('a')) c;    //c的类型为char& ,但是这么定义是错误的,因为引用必须被初始化

2.6自定义数据结构

本小节书中举的例子是struct,由于和C语言一样,我就不多赘述了.

值得拎出来强调的是头文件保护符:

#ifndef TEST_H
#define TEST_H
    /*
     *    具体的头文件内容
     */
#endif

写头文件的时候无论怎么样都最好加上一段包裹住代码,以防止重复包含头文件.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学Java还是学Android?如何选择?

学Java和学Android都有其各自的好处和应用场景。下面是一些关于学习Java和学习Android的信息&#xff0c;以帮助你做出选择&#xff1a;刚好我这里有嵌入式、plc、单片机的资料需要的在评论区扣6或私我 学习Java&#xff1a; Java是一种通用的编程语言&#xff0c;广泛应用于服…

Simulink自动把所有的double数据转换成single数据

目录 前言 子系统double自动转single操作步骤 总结 前言 在基于模型的开发建模中&#xff0c;模块大多默认的数据类型是double&#xff0c;很多MCU支持的是单精度的浮点&#xff0c;生成代码的部分需要把double转成single数据类型&#xff0c;当然在建模的时候可以配置每一…

GCP学习笔记(三)——存储和安全

文章目录 一、Cloud Storage二、Cloud Bigtable三、Cloud SQL四、Cloud Spanner五、Firestore六、Cloud Datastore七、安全1. Data Loss Prevention2. Stackdriver3. IAM 八、网络概述 在GCP中&#xff0c;我们需要序列化数据使数据能够进行存储和转换。Avro时一种数据序列化方…

清华唐杰新作WebGLM,参数100亿可联网

WebGLM是一个基于大语言模型&#xff08;LLM&#xff09;的联网问答聊天机器人&#xff0c;它的作者是清华大学计算机系唐杰教授团队&#xff0c;它的论文入选了KDD2023会议。 WebGLM的特点是它可以利用Web搜索和检索功能来增强LLM的能力和泛化性&#xff0c;从而实现一个高效、…

智驾产品价值逻辑变了,新一代智驾芯片的核心要求

“根据创新扩散理论&#xff0c;智能汽车的早期用户主要是‘发烧友’&#xff0c;但是真正起量需要依靠‘大众群体’。要想抓住智能驾驶普及的黄金增长机遇&#xff0c;必须捕捉到两个群体的差异化需求&#xff0c;理解行业规则的变化。在当下&#xff0c;智驾产品必须重视功能…

MySQL架构介绍

MySQL架构介绍 和其它数据库相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上&#xff0c;插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和…

【软考网络管理员】2023年软考网管初级常见知识考点(15)-网络管理与存储

涉及知识点 网络管理功能&#xff0c;网络管理模型&#xff0c;SNMP协议原理与版本&#xff0c;数据备份&#xff0c;DAS/NAS/SAN技术 软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 文章目录 涉及知识点一、网络管理功能二、…

容器访问外部网络之Linux ip_forward 数据包转发

文章目录 1 问题解决1.1 问题&#xff1a;1.2 原因&#xff1a;1.3 解决&#xff1a;临时打开&#xff1a;永久打开&#xff1a; 2 net.ipv4.ip_forward内核参数通俗解释3 在Linux中验证并实践net.ipv4.ip_forward设置 IP 地址设置路由信息打开 IP Forward 功能关闭主机 R 的防…

【LeetCode】动态规划 刷题训练(四)

文章目录 面试题 17.16. 按摩师(打家劫舍|)题目解析状态转移方程完整代码 213. 打家劫舍 II题目解析状态转移方程完整代码 740. 删除并获得点数题目解析预处理状态转移方程完整代码 面试题 17.16. 按摩师(打家劫舍|) 点击查看&#xff1a;按摩师 一个有名的按摩师会收到源源不…

【vue小知识】给DOM元素动态的添加上一个类||v-bind的妙用

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;vue文件怎么给DOM元素加上一个类 项目场景&#xff1a; 在前端页面逻辑操作中通常是存在click事件,添加点击效果是为了让页面操作起来更加的有操作性与互动性,那么有什么方式可以实现…

13个有趣的Python高级脚本!

关注“Python专栏”微信公众号&#xff0c;回复暗号【面试大全】&#xff0c;立即领取面试题简历模板。 每天我们都会面临许多需要高级编码的编程挑战。你不能用简单的 Python 基本语法来解决这些问题。在本文中&#xff0c;我将分享 13 个高级 Python 脚本&#xff0c;它们可以…

IP路由选择过程

1.1路由选择基础 路由选择是指将分组从一个设备通过互联网络发往位于不同网络上的另一个设备的操作。路由器不关注网络中的主机&#xff0c;而只关注互联起来的网络以及通往各个网络的最佳路径。 目标主机的逻辑网络地址用来获取通过可路由网络传送到指定网络中的分组&#xf…

(一)CSharp-Socket

一、套接字 Windows Sockets 只支持一个通信域&#xff1a;网际域&#xff08;AF-INET&#xff09;&#xff0c;这个域被使用网际协议族通信的进程所使用。 TCP/IP 的 Socket 则提供3种类型的套接字 1、流式套接字&#xff08;SOCK_STREAM&#xff09; 提供面向连接、可靠的数…

STM32 Proteus仿真闹钟设定万年历系统DS1302北京时间LCD1602蜂鸣器报警-0045

STM32 Proteus仿真闹钟设定万年历系统DS1302北京时间LCD1602蜂鸣器报警-0045 Proteus仿真小实验&#xff1a; STM32 Proteus仿真闹钟设定万年历系统DS1302北京时间LCD1602蜂鸣器报警-0045 功能&#xff1a; Protues版本&#xff1a;8.9 硬件组成&#xff1a;STM32F103R6单…

gif格式怎么转换成mp4? 这两个方法实用方便!

GIF&#xff08;Graphics Interchange Format&#xff09;文件是一种常见的动态图像格式&#xff0c;而MP4&#xff08;MPEG-4 Part 14&#xff09;则是一种流行的视频文件格式。有时候&#xff0c;您可能想要将GIF文件转换为MP4格式&#xff0c;以便在不同的平台和设备上进行更…

6-js基础-5

JavaScript 基础 - 5 知道对象数据类型的特征&#xff0c;能够利用数组对象渲染页面 对象综合案例数据类型存储 对象 对象&#xff08;Object&#xff09;&#xff1a;JavaScript里的一种数据类型&#xff08;引用类型&#xff09;&#xff0c;也是用于存储数据的 好处&#x…

机器学习笔记 - 了解机器学习中的小样本(Few-Shot)学习

一、背景概述 深度学习模型在图像分类、语义分割、对象检测等计算机视觉任务中的成功归功于利用了用于训练网络的大量标记数据——一种称为监督学习的方法。尽管在这个信息技术时代有大量的非结构化数据可用,但注释数据很难获得。 由于这个原因,计算机视觉机器学习项目中数据…

python spider 爬虫 之 urllib系列 urlretrieve下载照片、视频 网页

python 中 集成了 urllib urllib import urllib.request # urlopen 方法 url"url" response urllib.request.urlopen(url)print(type(response )) print(response.read()) # 解码 字节--->字符串 decode 字符串--》字节 encode print(response.read()…

腾讯课堂Python课程哪家强?

腾讯课堂Python课程哪家强&#xff1f; 文章目录 腾讯课堂Python课程哪家强&#xff1f;一、前言二、数据读取和数据预处理1、数据读取2、数据处理 三、有多少人愿意花钱学Python&#xff1f;四、多少价位的课买的人最多&#xff1f;五、哪家机构的课最多&#xff1f;销量最好&…

来评选你心中的TOP1编程语言

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…