C++基础(一) — 变量和基本类型

1. 基本内置类型

1.1. 算术类型

常用的算术类型包括:bool,char,int,long,long long,float,double。

其中,char字符最小占有8位,int整型最小占16位,long长整型最小占有32位,float单精度浮点数占有32位,double双精度浮点数占有64位。

除去bool型和扩展字符型,其他的整型可以划分带符号和无符号两种。

2. 变量

2.1. 变量定义

变量提供一个具名的,可供程序操作的存储空间。

2.2. 变量声明和定义的关系

变量声明:一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。

extern int i;//声明而非定义i

变量定义:负责创建与名字关联的实体,还可以申请存储空间,赋初始值。

 int i;//声明并定义i

变量有且只能被定义一次,但可以被多次声明。

3. 复合类型

两种常用的复合类型:引用和指针。

3.1. 引用

  • 定义:为对象起了另一个名字,引用类型引用另一个类型。

  • 通常表示形式:&d :

    int ival=1024;
    int &refVal=ival;
    
  • 引用即别名,而非对象。

3.2 指针

  • 定义:指针(pointer)是“指向”另一种类型的复合类型。
  • 与引用相同点:
    • 指针也实现了对其他对象的间接访问。
  • 与引用不同点:
    • 指针本身就是一个对象,允许赋值和拷贝,且在生命周期内可以先后指向不同对象。
    • 指针无须在定义时赋初值。

获取对象的地址

使用取地址符(&)获取指针存放某个对象的地址:

int ival=42;
int *p=&ival;//p存放变量ival的地址,或者说p是指向变量ival的指针

指针值

指针的值(即地址)应属于下列4种状态之一:

  1. 指向一个对象。
  2. 指向紧邻对象说占用空间的下一个位置。
  3. 空指针。
  4. 无效指针。

利用指针访问对象

使用解引符(*)来访问该对象:

int ival=42;
int *p=&ival;
cout<<*p;

解引用操作只适用于指向某个对象的有效指针。

空指针

空指针(null pointer)不指向任何对象。

初始化示例:

int *p1=nullptr;
int *p2=0;
//需要#include cstdlib
int *p3=NULL;

赋值和指针

引用:一旦定义,不可修改;
指针:给指针赋值就是令它存放一个新的地址,从而指向一个新的对象;

void*指针

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

3.2. 理解复合类型的声明

指向指针的指针

允许把指针的地址再存放到另一个指针当中。

示例:

int ival=1024;
int *pi=&ival;// pi指向一个int型的数
int **ppi=&pi;// ppi指向一个int型的指针

指向指针的引用

  • 引用本身不是对象,因此不能定义指向引用的指针;
  • 但指针是对象,所以存在对指针的引用;

示例:

int i=42;
int *p;
int *&r=p;// r是一个对指针p的引用

4. const限定符

  • 使用关键字const对变量限定,变量的值不能被改变。
  • 默认状态下,const对象仅在文件内有效。
  • 如果想多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。

4.1. const的引用

把引用绑定到const对象上,称为对常量的引用
同时,对常量的引用不能被用作修改它所绑定的对象。

const int ci=1024;
const int &rl=ci;

对const的引用可能引用一个并非const的对象。

4.2. 指针和const

指针常量

  • 指针常量:顾名思义它就是一个常量,但是是指针修饰的。
int * const p //指针常量
  • 因为声明了指针常量,说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是该地址里的内容可以被修改

常量指针

  • 常量指针: 如果在定义指针变量的时候,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量称为常量指针,格式如下
const int *p = &a; //常量指针
  • 因为常量指针本质是指针,并且这个指针是一个指向常量的指针,指针指向的变量的值不可通过该指针修改,但是指针指向的值可以改变。

4.3. 顶层const

  • 顶层const:表示指针本身是个常量,对任何数据都适用,如算术类型,类,指针等。
  • 底层const:表示指针所指的对象是一个常量,与指针和引用等复合类型的基本部分有关。
  • 指针既可以是顶层const,也可以是底层const。
const int ci=42;//不能改变cide值,这是一个顶层const
const int &p2=&ci;//允许改变p2的值,这是一个底层const

4.4 constexpr和常量表达式

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

constexpr变量

声明为constexpr的变量是哟个常量,而且必须用常量表达式初始化。

constexpr int mf=20;
constexpr int limit=mf+1;//mf+1 是常量表达式

指针和constexpr

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

与其他常量指针类似,constexpr 指针既可以指向常量也可以指向一个非常量。

5. 处理类型

5.1. 类型别名

类型别名可以让复杂的类型名字变得简单明了,易于使用。

传统方式:使用typedef关键字

typedef double wages;
typedef wages base, *p;

新方式:使用别名声明来定义

using SI=Scale_item;

指针、常量和类型别名

typedef char *pstring;
const pstring cstr=0;//cstr是指向char的常量指针
const pstring *ps;//ps是一个指针,他的对象是指向char的常量指针;

5.2. auto类型说明符

auto是让编译器根据初始值来判断变量的类型,所以必须有初始值。

5.3 decltype类型指示符

decltype类型的作用是选择并返回操作数的数据类型。

const int ci=0,&cj=ci;
decltype(ci) x=0;//x类型是 const int
decltype(cj) y=x;//y的类型是 const int& ,y绑定到变量x;

6. 自定义数据结构

struct Sales_data{
  std::string bookNo;
  unsigned units_sold=0;
  double revenue=0.0;
}

你可能感兴趣的:(C++开发进阶之路,c++,开发语言)