第2章 变量与基本类型

c++11

  • using -- 2.5.1
  • auto -- 2.5.2
  • decltype -- 2.5.3
  • 类内初始化 -- 2.6.1

2.5 处理类型

2.5.1 类型别名

  • typedef
typedef double aliasOfDouble, *aliasOfDoublePtr, &aliasOfDoubleRef;
  • using
using aliasOfDouble =double;
using aliasOfDoublePtr =double*;
using aliasOfDoubleRef =double&;
  • 类型别名与类型等价
  • 复合类型的类型别名是一个整体,不可拆分来理解
typedef double *aliasOfDoublePtr;
const aliasOfDoublePtr p;
const double *p;//非等价形式,直接拆分是错误的,并非指向常量的指针。
double *const p;//等价的形式,const是用于修饰double*双精度浮点数指针的,因此是常量指针。

2.5.2 auto类型说明符

  • 用于在声明时由编译器根据右值的数据类型推算数据类型
auto i = 0;//int
  • 一条语句可以声明多个变量,但是基本数据类型必须相同
auto i=0, *p=&i; //正确,都是整形
auto x=0, y=1.1; //错误,基本类型不同
  • 引用作为右值实则是其引用的对象,所以auto是其引用对象的数据类型,而非引用类型
  • 上面说到auto不会是引用类型,那么引用类型通过auto &实现
int y = 10;
auto & x = y;
  • 同为复合数据类型的指针,指针类型既可以使用auto,也可以使用auto *
  • auto忽略右值的顶层const,不会忽略底层const。
  • 如果希望包含顶层const,则需要明确指出
const auto x = 10;
  • 对于auto &保留auto&类型顶层const

2.5.3 decltype类型指示符

  • decltype()使得编译器不必进行表达式或者函数计算,而是取其返回值的数据类型作为自动类型,这样一来变量可以初始化为其他值;
decltype(f()) sum = x;
  • decltype的自动类型包含引用和顶层const,不同于auto
  • 因为decltype可以生成引用类型,如果要去引用,使得其生成引用所指的类型,可以将其作为表达式的一部分
int i=10, &r=i;
decltype(r+0) b;
  • 解引用操作的返回类型是引用类型
int i=10, *p=&i;
decltype(*p) b;//错误,b是一个int&,需要初始化
  • 变量加括号(x)是一个变量表达式,返回值是可以作为左值的x的引用
decltype((i)) d;//错误,d是一个整形引用,需要初始化

2.6 自定义数据结构

2.6.1 定义类型

  • struct
struct nameOfStruct {
  //类体可以为空
  std:string strOfstruct;
  int intOfStruct = 0;
  double doubleOStruct {1.0};
  unsigned uiOfStruct(0);//错误
};
  • 花括号结束带分号;,这是为了可以在定义struct类型时同时定义对象。但是不推荐在一个语句里面定义两种类型。
struct nameOfStruct{} obOfStruct, *ptrOfStruct;
struct nameOfStruct{};
nameOfStruct obOfStruct, *ptrOfStruct;
  • 可以初始化数据成员,没有初始化的默认初始化;只能使用等号右值或者花括号,不能适用圆括号。

2.6.2 使用类

  • 点操作符.
nameOfStruct firstObject;
std::cin >> firstObject.intOfStruct >> firstObject.doubleOStruct;
std::cout << firstObject.intOfStruct << firstObject.doubleOStruct;

2.6.3 编写头文件

  • 类一般定义在头文件中,头文件名建议与类名保持一致
  • #include是一项预处理功能,是由预处理器实现的,预处理器将#include包含的内容使用指定头文件代替
  • 头文件保护符是另一项预处理功能,用于解决头文件多次包含;头文件保护符依赖于预处理变量,预处理变量无视作用域,因此需要保证唯一,一般使用全大写避免与一般变量冲突。
#ifndef NAME_OF_STRUCT_H
#define NAME_OF_STRUCT_H
#include <string>
struct nameOfStruct {
  std:string strOfstruct;
  int intOfStruct = 0;
  double doubleOStruct {1.0};
  unsigned uiOfStruct=0;
};
#endif
posted @ 2023-04-18 23:55  ETHERovo  阅读(9)  评论(0编辑  收藏  举报