C++ Primer学习笔记-----第二章:变量和基本类型

2.1:
基本内置类型:算术类型和空类型(void)。
算术类型:整形(包括字符、布尔)和浮点型。

字符型分为三种:char、signed char、unsigned char
char和signed char并不一样,尽管字符型有三种,但字符的表现形式只有两种:带符号和无符号的。
类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。

切勿混用带符号类型和无符号类型

2.2:
定义在函数体内部发内置类型变量不被初始化,定义域任何函数体之外的变量被初始化为0。

变量只能被定义一次,可以被多次声明。
extern int a; //声明a
int a; //声明并定义a
extern int a=1; //定义a

2.3:复合类型(引用和指针):基本数据类型,紧随其后的一个声明符列表组成。

引用:
int a=1;
int &b=a;

引用并非对象,只是为一个已经存在的对象所起的另外一个名字。
引用本身不是一个对象,所以不能定义引用的引用。
引用在定义是必须初始化

指针:
指针本身是一个对象,无须在定义时赋初值,在块作用域内顶一顶指针如果没有被初始化,用于一个不确定的值

int a=1;
int *b=&a;

空指针:
int *a=nullptr; //c++11
int *b=0;
int *c=NULL;//内部还是0,和第二种一样,预处理后NULL会被替换为0

void*指针:用于存放任意对象的地址

指向指针的引用
int *a=0;
int &b=a; //b是一个对指针a的引用
要判断b的类型:从右往左阅读b的定义。
离变量名最近的符号对变量有最直接的影响,因此b是一个引用。
声明符的其余部分用以确定b引用的类型是什么,此例中的符号
说明b引用的是一个指针。
最后声明的基本数据类型部分指出b引用的是一个int指针。

2.4:const限定符
int a=1;
const int b=1;//b的值不能更改
const int c=&a;//不能通过c修改值
const int * const d=&a; //不能通过*d修改值,d的指针的值也不能修改
const int &e=a; //不能通过e修改值

constexpr:由编译器来验证变量的值是否是一个常量表达式。
constexpr int a=5;
constexpr int b=Size(); //Size()函数必须有constexpr修饰

constexpr int Size()
{
return 1;
}

constexpr声明中如果定义了指针,仅对指针有效。
int a=1;
constexpr int *b=&a; //b指针不能修改
等于int * const b=&a;

2.5:处理类型
类型别名:两种方式
1.typedef double a,b,*c; //可以用多个别名
2.using a=double; //别名声明(c++11)

typedef char *ch;
const ch a=0; //a是指向char的常量指针
const ch *b; //b是一个指针,它的对象是指向char的常量指针

auto:会忽略顶层const,保留底层const
顶层const(指针本身是个常量),顶层const可以表示任意的对象是常量,对任何数据类型都使用。
底层const(指针所指的对象是个常量),底层const与指针和引用等复合类型的基本类型部分有关。

int x=0;
const int a=x, &b=a; //a的值不能修改
auto c=a; //c是一个整数(const被忽略掉,可以修改c值)
auto d=b; //d是一个整数(b是a的别名,忽略const)
auto e=&x; //e是一个整型指针
auto f=&a; //f是一个指向整数常量的指针,不能修改f指向的值
const auto g=a; //手动添加const

设置一个类型为auto的引用时,初始值中的顶层常量属性保留
auto &h=a; //h是一个整型常量引用,绑定到a,不行修改h的值
auto &i=33;//错误:不能为非常量引用绑定字面值
const auto &j=33; //正确:可以为常量引用绑定字面值

一条语句中定义多个变量,初始值必须是同一种类型
auto &m=1,*n=1.5; //错误,推导出不是同一种类型

decltype类型指示符(C++11)
返回操作数的数据类型,编译器分析表达式并得到它的类型,却不实际计算表达式的值。
decltype(f()) sum=x;

处理变量时,decltype返回该变量的类型
const int a=0,&b=a;
decltype(a) x=0; //x的类型是const int
decltype(b) y=x; //y的类型是const int&,y绑定到变量x
decltype(b) z; //错误:z是一个引用,必须初始化

处理表达式时,如果表达式的内容是解引用操作,则decltype将得到引用类型
int i=42,*p=&i,&r=i;
decltype(r+0) b; //正确:加法的结果是int,b是一个未初始化的int
decltype(*p) c; //错误:c是int&,必须初始化

decltype和auto的另一处重要区别是,decltype的结果类型与表达式形式密切相关,有一种情况需要特别注意:
对于decltype所用的表达式来说,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同。
如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上一层或多次括号,编译器就会把它当成是一个表达式,这样的decltype就会得到引用类型。

decltype((i)) d; //错误:d是int&,必须初始化
decltype(i) e; //正确:e是一个未初始化的int

decltype((variable))(注意是双括号)的结果永远是引用。
decltype(variable) 结果只有当variable本身就是一个引用时才是引用。

2.6.自定义数据结构

类定义的最后加上分号,因为类体后面可以紧跟变量名以示对该类型对象的定义,所以分号必不可少
struct MyData{/* */} a,b,*c;

和上面等价,下面的形式会更好
struct MyData{/* */};
MyData a,b,*c;

头文件避免重复包含

#ifndef SALES_DATA_H
#define SALES_DATA_H

struct MyStruct
{
	int num;
};
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值