C++ Primer读书笔记——2.5 处理类型& 2.6 自定义数据结构(2019.9.1)

2.5 处理类型

2.5.1 类型别名

类型别名是某种类型的同义词,类型别名和类型的名字等价
好处:①复杂名字简单化;②知道使用该类型的目的
方法:①typedef 类型 类型别名;②using 类型别名=类型;

2.5.2 auto类型说明符

原因:当把表达式的值赋给变量时,要求在声明变量的时候清楚地知道表达式的类型,因此c++ 11引入auto类型说明符,让编译器帮助分析表达式所属类型
注意事项:auto让编译器通过初始值来推算变量的类型,因此auto定义的变量必须有初始值
可以使用auto在一条声明语句中声明多个变量,需注意所有变量的初始基本数据类型必须一样。
例如:

auto i=0,*p=&i;  //正确,auto此处代表整型
auto sz=0,pi=3.14 //错误,auto不能既做整型,又做浮点型

引用和auto:使用引用即使用引用的对象,当引用被用作初始化值时,真正参与初始化的是引用对象的值,所以编译器以引用对象的类型作为auto的类型。
例如:

int i=0,&r=i;
auto a=r; //a是一个整型,因为r是i的别名,而i是一个整数

2.5.3 decltype类型指示符

适用:希望从表达式的类型推断要定义的变量的类型,不想用该表达式的值初始化变量。decltype和auto都是c++ 11新特性
例如:

decltype(f()) sum=x; //sum的类型就是函数f的返回类型

编译器对于decltype的解读:编译器分析表达式并得到它的类型,不实际计算表达式的值
如果decltype使用的表达式不是一个变量,则返回表达式结果对应的类型
如果decltype使用的表达式是左值,返回引用类型
decltype的结果类型与表达式形式密切相关。如果是双层括号(即decltype((variable)))的结果永远是引用。

2.6 自定义数据结构

2.6.1 定义类

定义类:struct 类名{类体};
(注意:定义类和结构体都必须以分号结尾)
类数据成员:每个对象有自己的一份数据成员拷贝
类内初始值:c++11新特性,可以为数据成员提供一个类内初始值。如果设定了类内初始值,创建对象时,类内初始值将用于初始化数据成员。
类内初始值的使用限制:或者放在花括号里,或者放在等号右侧,不能使用圆括号。
自定义数据结构的两个关键字:struct和class,class和struct定义类的唯一区别是默认的访问权限:struct所有成员的默认访问权限是public,class所有成员的默认访问权限是private

2.6.3 编写自己的头文件

类通常被定义在头文件中,类所在头文件的名字应与类的名字一样。
头文件通常包含那些只能被定义一次的实体,如类、const和constexpr变量
如何保证当头文件被多次包含时也能安全和正常地工作?头文件保护符+预处理变量,预处理变量有两种状态:定义与未定义。#define把一个名字设定为预处理变量,#ifdef和#ifndef检查某个指定的预处理变量是否已经定义。示例如下:

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data{
  std::string bookNo;
  unsigned units_sold=0;
  double revenue=0.0;
};
#endif

补充:预处理变量无视c++中关于作用域的规则。
要求程序中预处理变量和头文件保护符必须唯一,一般基于头文件中类的名字来构建保护符的名字,为避免冲突,一般把预处理变量的名字全部大写。
定义头文件时习惯性地加上头文件保护符,以确保头文件万一被多次引用时也能正常使用。

第2章 变量和基本类型 小结

类型规定了对象的存储要求和所能执行的操作。
c++提供了一套基础内置类型,与实现它们的机器硬件密切相关
类型分为常量和非常量,常量类型必须初始化
还可以定义复合类型,复合类型以其他类型为基础
c++允许以类的形式自定义类型,c++库通过类提供了一套高级抽象类型(输入、输出、string)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值