🍓 基本内置类型
type
status
date
slug
summary
tags
category
icon
password
Property

 

基本内置类型

C++定义了一套包括算术类型空类型在内的基本数据类型
  • 算术类型包含了字符、整型数、布尔值和浮点数
  • 空类型不对应具体的值,仅用于一些特殊的场合,例如函数的返回类型为空类型、函数的参数为空、指针指向void
 
 
算术类型又分为两类: 整型(包括字符符和布尔类型在内)和浮点型
🍓 变量
type
status
date
slug
summary
tags
category
icon
password
Property
🍓
目录

变量提供一个具名的、可供程序操作的存储空间。C++的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C++来说,变量对象一般可以交换使用。
 

标识符

变量命名有许多约定俗成的规范,下面的这些规范能有效提高程序的可读性:
  • C++ 的变量名,即标识符,由字母、数字和下划线组成,其中必须以字母或下划线开头
  • 变量名一般用小写字母,用户自定义的类名一般以大写字母开头
  • 标识符的长度没有限制,但是对大小写字母敏感;如果由多个单词组成, 单词间要有明显区分
  • C++ 为标准库保留了一些名字,也就是关键字,不能用作程序的标识符
    🍓 引用和指针
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
    🍓
    目录

     
    引用和指针都是复合类型,复合类型是指基于其他类型定义的类型

    引用

    C++11新增了右值引用,一般的引用指的是左值引用。引用为对象起了另外一个名字,语法格式:
     
    通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。不能定义引用类型的引用,但可以定义任何其他类型的引用
    🍓 const限定符
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
    🍓
    目录

    常量

    使用const可以定义值不可变的变量,这种值是常量。通常,常量用于缓冲大小、最大限度等对于程序来说有特殊含义的值。
    由于不能改变常量的值,所以常量必须初始化,初始化与变量初始化一样,特别是可以将常量初始化为运行时值,而 #define 只能让你定义字面量的常量。
     
    对于内置类型来说只要不涉及到赋值就不会改变其值,所以常量也能进行所有这些操作。当使用对象去初始化另外一个对象时,不管是常量还是非常量都是可以的,初始化别的对象并不会改变当前对象。复制对象并不会改变原始对象,一旦复制完成,新的对象就不能够再访问原始对象了。
     
    🍓 类型别名
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
     
    类型别名分为两种方式:旧式C的 typedef和新式C++using
     
    类型别名,就是给类型起个另外的名字,可以简化类型定义、易于使用并且强调了类型的作用:
    typedef 是基础类型的一部分,有typedef的声明是在定义类型别名而不是变量,与定义变量一样,声明符中的*不会对所有名字起作用
     
    C++11 定义了新的定义别名方式:
    将定义nametype的别名。使用类型别名跟类型名的效果是一样的,因而类型别名可以出现任何类型名出现的地方。
     
    定义指针的类型别名时需要注意,如果用const修饰类型别名将导致指针本身是 const的,而不是指针所指向对象是const
    🍓 auto关键字C++11
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
     
    C++11标准引入auto类型说明符,让编译器去推断变量的类型,使用auto的变量必须具有初始值:
     
    auto可以定义多个变量,声明中的所有初始值必须拥有一致的类型:
    当涉及到auto推断的引用、指针、const混杂在一起时会变得尤其复杂:
     
    编译器推断出来的 auto类型和初始值的类型并不完全一样,会适当地改变结果类型,使其更符合初始化规则:
    • 当引用被用作初始值时,真正参与初始化的其实是引用对象的值。编译器以引用对象的类型作为 auto 的类型
      🍓 decltype类型指示符
      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会得到引用类型,因为变量是一种可以作为赋值语句左值的特殊表达式。
      🍓 标准库类型string
      type
      status
      date
      slug
      summary
      tags
      category
      icon
      password
      Property
       

       
      string表示可变长度的字符串。string类型包含在 <string> 头文件中。
      之所以抛弃char*的字符串而选用C++标准库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,它集成的操作函数足以完成大多数情况下的需要。
       

      定义和初始化string对象

      如何初始化类的对象是类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量不同, 或者是初始值的类型不同。
      类类型会调用类自己的构造函数进行初始化,一个类会定义多个构造函数来执行初始化。
      🍓 标准库类型vector
      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>>
       
      🍓 迭代器
      type
      status
      date
      slug
      summary
      tags
      category
      icon
      password
      Property
      🍓
      目录

       
      可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator)。
      C++中更常用的访问容器中的元素方式是通过迭代器,因为有些容器无法通过下标来访问的,这种容器是不可随机访问的。所有容器都可以通过迭代器来访问元素。虽然string不是容器,但是string支持很多容器的操作,包括迭代器和下标访问。
       
      迭代器是对语言中的指针的一种抽象和模拟,用来间接访问元素。与指针一样,通过迭代器可以从一个元素移动到另一个元素,可以通过解引用返回元素的引用,可以通过箭头符调用其成员函数。迭代器也有非法迭代器(invalid iterator)只有确实指向元素或者指向尾元素的下一个位置才是合法迭代器,其它所有迭代器都是非法的。
       

      迭代器

      和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为beginend的成员:
      🍓 数组
      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++继承了Cstruct,并且加以扩充。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到CC++过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能
       
      C++中,structclass基本是通用的,唯一不同的是:
      • 如果使用class关键字,类中定义的成员变量或成员函数默认都是private属性的
      • 而采用struct ,结构体中定义的成员变量或成员函数默认都是public属性的