🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
变量提供一个具名的、可供程序操作的存储空间。
C++
的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C++
来说,变量和对象一般可以交换使用。标识符
变量命名有许多约定俗成的规范,下面的这些规范能有效提高程序的可读性:
C++
的变量名,即标识符,由字母、数字和下划线组成,其中必须以字母或下划线开头
- 变量名一般用小写字母,用户自定义的类名一般以大写字母开头
- 标识符的长度没有限制,但是对大小写字母敏感;如果由多个单词组成, 单词间要有明显区分
C++
为标准库保留了一些名字,也就是关键字,不能用作程序的标识符
🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
常量
使用
const
可以定义值不可变的变量,这种值是常量。通常,常量用于缓冲大小、最大限度等对于程序来说有特殊含义的值。由于不能改变常量的值,所以常量必须初始化,初始化与变量初始化一样,特别是可以将常量初始化为运行时值,而
#define
只能让你定义字面量的常量。对于内置类型来说只要不涉及到赋值就不会改变其值,所以常量也能进行所有这些操作。当使用对象去初始化另外一个对象时,不管是常量还是非常量都是可以的,初始化别的对象并不会改变当前对象。复制对象并不会改变原始对象,一旦复制完成,新的对象就不能够再访问原始对象了。
默认情况下,const 变量仅在文件内有效
🍓
type
status
date
slug
summary
tags
category
icon
password
Property
类型别名分为两种方式:旧式C的
typedef
和新式C++
的using
类型别名,就是给类型起个另外的名字,可以简化类型定义、易于使用并且强调了类型的作用:
typedef
是基础类型的一部分,有typedef
的声明是在定义类型别名而不是变量,与定义变量一样,声明符中的*
不会对所有名字起作用C++11
定义了新的定义别名方式:将定义
name
为type
的别名。使用类型别名跟类型名的效果是一样的,因而类型别名可以出现任何类型名出现的地方。定义指针的类型别名时需要注意,如果用
const
修饰类型别名将导致指针本身是 const
的,而不是指针所指向对象是const
:🍓
type
status
date
slug
summary
tags
category
icon
password
Property
C++11
标准引入auto
类型说明符,让编译器去推断变量的类型,使用auto
的变量必须具有初始值:auto
可以定义多个变量,声明中的所有初始值必须拥有一致的类型:当涉及到
auto
推断的引用、指针、const
混杂在一起时会变得尤其复杂:编译器推断出来的
auto
类型和初始值的类型并不完全一样,会适当地改变结果类型,使其更符合初始化规则:- 当引用被用作初始值时,真正参与初始化的其实是引用对象的值。编译器以引用对象的类型作为
auto
的类型
-
auto
一般会忽略顶层const
,同时底层const
则会保留下来
🍓
type
status
date
slug
summary
tags
category
icon
password
Property
C++11
引入了decltype
类型说明,其作用是选择并返回操作数的数据类型,编译器将对表达式进行分析得出结果的类型但不会真正求值:decltype
处理顶层const
和引用的方式与auto
有些不同,如果decltype
使用的表达式是一个变量,则decltype
返回该变量的类型(包括顶层const
和引用)。只有在decltype
表达式中引用不被当做其绑定的对象的别名。如果
decltype
使用的表达式不是一个变量,则decltype
返回表达式结果对应的类型。如果表达式的内容是解引用操作,则decltype
将得到引用类型。decltype
和 auto
的另一处重要区别是,decltype
的结果类型与表达式形式密切相关。注意:如果 decltype
使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上了一层或多层括号,则 decltype
会得到引用类型,因为变量是一种可以作为赋值语句左值的特殊表达式。🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
string
表示可变长度的字符串。string
类型包含在 <string>
头文件中。之所以抛弃
char*
的字符串而选用C++
标准库中的string
类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,它集成的操作函数足以完成大多数情况下的需要。定义和初始化string对象
如何初始化类的对象是类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量不同, 或者是初始值的类型不同。
类类型会调用类自己的构造函数进行初始化,一个类会定义多个构造函数来执行初始化。
🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
标准库类型
vector
表示对象的集合,也叫做容器,定义在头文件vector
中。vector
中所有对象的类型都相同,每个对象都有一个索引与之对应并用于访问该对象。C++
中同时有类模板和函数模板,vector
是一个类模板。模板本身不是函数或者类,但是当提供实例化参数时,编译器会帮助生成新的函数或者类,这个过程叫做实例化。实例化参数包含在模板名称后的尖括号中,如:
vector<int>
和vector<vector<string>>
,可以将 vector
实例化为包含绝大多数类型,甚至元素可以是 vector
。注:早期的
C++
标准中,如果vector
的元素还是vector
(或者其他模板类型),则其定义的形式与现在的C++11
新标准略有不同。过去,必须在外层vector
对象的右尖括号和其元素类型之间添加一个空格,如应该写成vector<vector<int> >
而非vector<vector<int>>
。vector
中的元素是顺序存储的,意味着元素不仅仅可以通过迭代器进行访问,并且可以使用元素指针的偏移进行访问。这就是说可以将vector
元素的指针传递给一个期待数组元素指针的函数。🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
可以使用下标运算符来访问
string
对象的字符或vector
对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator)。在
C++
中更常用的访问容器中的元素方式是通过迭代器,因为有些容器无法通过下标来访问的,这种容器是不可随机访问的。所有容器都可以通过迭代器来访问元素。虽然string
不是容器,但是string
支持很多容器的操作,包括迭代器和下标访问。迭代器是对语言中的指针的一种抽象和模拟,用来间接访问元素。与指针一样,通过迭代器可以从一个元素移动到另一个元素,可以通过解引用返回元素的引用,可以通过箭头符调用其成员函数。迭代器也有非法迭代器(invalid iterator),只有确实指向元素或者指向尾元素的下一个位置才是合法迭代器,其它所有迭代器都是非法的。
迭代器
和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为
begin
和end
的成员:begin
成员负责返回指向第一个元素(或第一个字符)的迭代器
🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
数组类似
vector
,也是存放类型相同的对象的容器,但数组的大小确定不变,不能随意向数组中添加元素。如果不清楚元素的确切个数,应该使用vector
。通常使用数组是由于其优于vector
的运行性能。建议除非有充分的理由使用数组,尽可能是在任何场景使用vector
。定义和初始化内置数组
数组是复合类型,而且数组的维度是其类型的一部分,因而
int[3]
和int[10]
不是同一种类型。C++
要求数组的维度在编译时就得确定,且维度必须是一个常量表达式。注:某些编译器是允许定义可变长度数组(VLA),这是编译器自己的扩展行为并不属于语言标准。
在不给定初始值时,数组是默认初始化的。内置类型数组如果定义在函数中,其默认初始化是未定义值。
🍓
type
status
date
slug
summary
tags
category
icon
password
Property
目录
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,是一种复合数据类型。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。
C++
继承了C
的 struct
,并且加以扩充。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C
中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++
中,考虑到C
到C++
过渡的连续性,对结构体进行了扩展,C++
的结构体可以包含函数,这样,C++
的结构体也具有类的功能。在
C++
中,struct
与class
基本是通用的,唯一不同的是:- 如果使用
class
关键字,类中定义的成员变量或成员函数默认都是private
属性的
- 而采用
struct
,结构体中定义的成员变量或成员函数默认都是public
属性的