C++学习-变量类型

来源:互联网 发布:淘宝卖家怎么去谈快递 编辑:程序博客网 时间:2024/05/17 19:21

索引

  • 整型
  • 浮点型
  • 数组
  • 指针
    • 变量指针
    • 函数指针
    • this指针
  • 枚举
  • 结构体
  • 共用体
  • 字符串
  • 引用
  • 左值与右值

整型

  • 种类(宽度递增):bool char、short、int、long、long long,每种类型都有有符号和无符号版本
  • unsigned前缀的整型只能取正值,无前缀正负均可取。
  • 整型后缀
    • l/L:整数为long常量 10L;
    • u/U:整数为unsigned int 常量,如78u;
    • UL:整数为unsigned long常量,如78UL;
    • Long long 后缀为LL
    • Char_16t的前缀为u;char_32t前缀为U;wchar_t前缀为L;
  • C++在处理十进制整数时,使用无前缀的由int起的能够存储该值的最小类型表示;
  • 处理八进制和十六进制时,使用所有由int起的能够存储该值的最小类型表示;

浮点型

  • 浮点数能够表示带小数部分的数字,还能表示比 long 大的整型,类型随宽度递增为float、double、long double
  • 默认情况下输入的浮点常量存储为double类型,如需存储为float类型,在浮点常量后加f/F后缀,long double类型加l/L后缀
  • E表示法
    • 如3.45E6 E6代表10的6次方,该数为345000,6为指数,3.45为尾数
    • 可在前面加正负号,如:-3.45E6
    • 数字中不能有空格,类似3.45 E6是非法的
    • 指数为负数为除以十的乘方,如3.45E-6是3.14除以10的6次方
    • 前面的符号用来赋值,后面的指数符号用来缩放

数组

  • 数组是一种数据形式,能够存储多个同类型的值,每个值存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素
  • 创建数组的声明语句包含:存储在每个元素中值的类型、数组名、数组中元素数
  • 通用格式: 类型 数组名[元素数] 。 元素数必须是整型常数或const值,也可是是常量表达式,所有的值在编译时已知
    如:创建一个名为A的数组,该组有12个元素,每个元素存储一个short类型的值 short A [12]
  • 可将数组中每个元素看作是一个简单变量
  • C++数组从0开始编号使用带索引的方括号表示法,如A[0]是month数组中第一个元素。最后一个元素的索引比数组长度小1,A[11]是数组A最后一个元素
  • 只有在定义数组时才能使用初始化,也不能将一个数组赋给另一个数组 如:int A[3]可以,但不能接A[3] = {1,2,3]
  • 初始化数组时,提供的值可以小于数组的元素数目 该语句只初始化A的前两个元素:int A [3] = [1,2],其他元素初始化为0
  • 如果初始化数组时元素数为空,编译器将计算元素个数 如int A []=[1,2,3],编译器将使A包含3个元素
  • 在用大括号对数组进行列表初始化时
    • 大括号可以不包含任何东西,把所有元素设为0
    • 可以省略等号(C++11)
    • 不允许缩窄操作

指针

变量指针

  • 指针是一个变量,存储地址。
  • 指针定义为类型名*,如int *a
  • 对变量使用&运算符可得到其位置,如&int A。对于常规变量来说,值是指定的量,而地址是派生量
  • 指针与常规变量相反,地址为指定量,值为派生量。*运算符为间接值,用于指针上可得到该地址存储的值

    int a = 3;int *b = &a

    b为指针,b为a的地址,*b为a的值。&a与b等价。可修改*b来修改a的值

  • 指针不是整型,因此不能把整数直接赋给指针.将一个整型(地址)赋给指针需要强制类型转换。
    int* a = (int*)0xB1311231
  • 指针算数
    • 指针变量加1后,对其地址而言,增加的量等于其类型的字节数。因为地址发生了偏移,指针所指地 址的值会发生相应的变化,如++b=b+1
    • 指向同一数组的两个指针相减,得到的是整数值,值为两个元素的间隔
  • 在多数情况下,C++将数组名解释为数组第一个元素的地址。因此程序中D指针初始化后指向B[0],数组名=&数组第一个元素
  • const与指针的关系:
    • const (type)*name:不可通过解引用修改指针指向的内容,但可以修改指针的指向
      如:int a = 10,c=1; const int *b = &a; a=20;(正确);*b=20(错误);*b=&c(正确)
    • (type)* const name:不可修改指针的指向,但可通过解引用修改指针的内容
    • 禁止将const类型的地址赋给非const类型的指针
    • 在定义函数原型时,要注意形参的类型

函数指针

  • 函数名即是函数的地址,如果think()是一个函数,think就是该函数的地址
  • 声明函数的指针:声明函数的指针时,须指定指针指向函数的类型
    • 例:函数原型为double a (int b),则指针的声明为 double(*f1)(int a); pf=a
    • 注意:指针的括号不可以省略,否则将声明一个返回double类型指针的函数
    • 声明指向该类型函数的指针数组:double *(*pa[3]) (int a)={f1,f2,f3}
    • 声明指向函数指针数组的指针:double *tr = *(*(*pd)[3])(int a)=&pa
    • 注意解引用的层级
    • 将函数地址赋给指针后,可以将解引用后的指针看作函数名,也可以直接将指针名看作函数名
      即(*pf)与pf是等价的,都可以作为a函数使用
    • 使用auto类型自动判断,如auto p = bkb(auto类型不能用于初始化列表)
    • 使用typedef简化程序,将一个变量名声明为函数指针类型别名
      如:typedef ppp = double tr = *(*(*pd)[3])[int a)=&pf; ppp pa={f1,f2,f3}

this指针

  • 每个类对象的成员函数(包括构造函数和析构函数)都有一个this指针,指向调用对象

    const custom_type& compare(const custom_type& b){    if(a.data > this->data)        return a;    else        return *this}
  • 此例中被调用的对象为b,但this指向调用b的对象。
  • this的类型为const custom_type *,在返回或作传入参数时要注意带const限定符
  • this指针只能用在非静态成员函数内部,即在类内函数定义时方可使用

枚举

  • enum是一种创建符号常量的方式,允许定义新类型。
  • enum A {B,C,D,E}; 此条语句将完成两项工作:让A成为新类型的名称,将B、C、D、E、作为符号常量,对应值为0~3,这些常量叫做枚举量。默认情况下,后面的值比前面大1。
  • 可指定枚举的值,如enum A1{B=-3,C=4,D,E}
  • 可用枚举名来声明这种类型的变量 如enum A
  • 枚举的特殊属性
    • 在不进行强制类型转换的前提下,只能将定义枚举时使用的枚举量赋予枚举变量
    • 枚举无算数运算
    • 枚举是整型,可被提升为int类型,但int类型不能转换为枚举类型
    • 如果int值是有效的,可以通过强制类型转换将值赋予枚举变量
    • 可以创建多个值相同的枚举量
  • 枚举的取值范围
    • 上限为大于枚举量的最大值的最小的2的幂,将其减1。 A中上限为 4-1=3
    • 下限取决于枚举量的最小值,如果其不小于0,则下限为0;否则采取寻找上限的方法,但要加上负号A1中为-(4-1)=-3
  • 作用域内枚举(C++ 11)

    • 传统枚举中,两个定义枚举定义中的枚举量不能相同,因为它们在相同作用域内。类枚举的作用域为类,可定义名称相同枚举量。
    • 作用域内明方式为:enum class 类名{枚举量},也可使用struct替代class关键字。访问枚举量时要使用作用解析运算符

      enum class a {yellow, blue}enum struct b {yellow, blue}a c = a::yellowb d = b::blue
    • 类枚举量不能隐式转换成整型,但可以强制类型转换
    • 类枚举的底层类型为int,可以指定枚举底层类型,定义方式为enum class枚举名 : 类型名{枚举量}
      enum class test : char {yellow = 'a', blue = 'b'}

      • 类枚举的底层类型必须为整型

结构体

  • 结构是用户定义的类型,结构声明定义了该类型的数据属性。创建结构的过程为定义结构描述后按描述创建结构变量
  • 结构体的定义为struct name{ … },
    struct表明该代码定义的是一个结构布局,标识符name是这种数据的名称。大括号中包含的是结构的数据类型列表,每个列表项都是一条声明语句。
  • 创建结构描述后,可创建该类型的变量,如name A。 A是name数据类型,A中的数据类型、顺序与name一一对应。可以使用成员运算符.来访问E中的成员,如A.E
  • 只有两结构存储的值相同,则结构成员的赋值有效
  • 可以同时完成定义结构和创建结构变量的工作,将变量名直接放在定义结构结束花括号后面

    struct exp{    int a;    char b;}test(3,'4');
  • 可声明匿名的结构类型,方法是省略结构名称。

    struct {    int a;    char b;}test(3,'4');

    此将创建一个名为test的结构变量,可以使用成员运算符来访问其成员。但此类型没有名称,因此以后将不能创建此类型的变量

  • 结构中的位字段:为特定的成员分配空间。字段的类型为整型或枚举,接下来是冒号和数字。如int A : 4

共用体

  • 共用体是一种格式,可存储不同的数据类型。与结构不同的是,共用体只能同时存储一种类型。共用体可节省内存。共用体本质上为一块内存区以不同的方式读取,对共用体内某一数据进行修改可能影响其他数据
  • 声明方式为union name { … }
  • 共用体长度为最大成员的长度

字符串

  • 字符串是存储在内存的连续字节中的一系列字符
  • C风格字符串: 例:char dog[4]=[‘d’ , ‘o’ , ‘g’ ,’\0’ ]字符串必须以空字符结尾
  • 字符串常量法:char fish[] = “fish”此方法不需加入空字符
  • 在确定存储字符串所需最短数组时要将结尾的空字符计算在内
  • 字符串常量为双引号,字符常量为单引号————“S”=‘s’+’\0’
  • 拼接字符串:任何两个由空白(空格、制表符、换行符)分隔的字符串常量将自动拼接成一个。
    拼接时不会在被连接的字符串中添加空格,第一个字符串中的’\0’将被第二个字符串的第一个字符取代。
  • 在数组中使用字符串有两种方法:将数组初始化为字符串常量、将键盘或文件的输入读入到数组中
    需要使用头文件:cstring
  • 将数组初始化为字符串常量时,可用索引来访问数组中各个字符。可用’\0’截短字符串
  • 原始字符串:字符表示的就是其本身,如\n不表述换行符而是字符\n。原始字符串的前缀为R,使用”+* +*”作界定符。

引用

  • 引用是已定义变量的别名。
  • 引用变量的主要用途是作为函数的形参使用,效果同指针作形参,即改变了原来的值
  • 声明引用变量:类型名 & 新变量名 = 变量名
  • int &b = a,a与b的存储地址、类型与值都相同,对a的操作等价于对b的操作
  • 引用变量必须在声明时进行初始化,int &b;b=a是错误的
  • 引用接近于const指针,int &b = a等价于 int * const b = &a,指针的指向不可改变
  • 右值引用:double && a = 7.0,a为7.0这一个值的引用。

左值与右值

  • 左值是可以被引用的数据对象,如变量、数组元素、结构体成员。
  • 右值包括字面常量和包含多项的表达式
原创粉丝点击