第2章 变量和基本数据类型

本文详细介绍了C++中的变量初始化方式,包括C++11的四种初始化方法及注意事项,探讨了内置类型变量的默认初始化行为,以及引用、指针、const限定符的使用规则。同时,文章还讲解了如何处理类型,包括类型别名的定义和auto、decltype的使用,最后介绍了自定义数据结构的基本概念。

2.2 变量

C++11 初始化方式

int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);

内置类型使用列表初始化且初始值存在丢失信息的风险,编译器将报错

long double ld = 3.1415926536;
int a(ld), b = {ld}; // 存在数据丢失风险,报错
int c(ld), d = ld;   // 正确

函数体外的内置类型变量默认初始化为0,函数体内为初始化的内置类型变量值时

初始化内置类型变量

内置类型没有被显示初始化,其值由定义的位置决定。定义于任何函数体之外的变量被初始化为0,但函数体内部的内置类型变量将不被初始化,其值是未定义的。类的对象如果没有显示地初始化,则其值由类确定。

引用必须被初始化,且初始值必须是一个对象,类型也要一致。

2.3 指针

不能把 int 变量直接赋值给指针,即使int变量的值恰好等于0

void* 指针

  • 指针比较
  • 函数输入输出
  • 赋值

指向指针的引用

int i= 42int *p;
int *&r = p;
r = &r;
*r = 0;

2.4 const 限定符

const对象必须初始化,默认状态下, const 对象仅在文件内有效,要在多个文件之间共享 const 对象,在定义之前添加 extern 关键字。

// file.c 定义并初始化一个常量,能被其他文件访问
extern const int bufsize = fcn();
// file.h
extern const int bufsize;

对 const 的引用可能引用一个并非 const 对象,常量引用对于引用的对象本身是不是常量未作限定。

int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0;     // 可以修改
r2 = 0;     // 不能修改

指针和const

指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针。

指向常量的指针其所指的对象不一定是一个常量,只代表不能通过指针改变对象的值。

const double pi = 3.14;
double *ptr = π
const double *cptr = π
*cptr = 42;

const 指针

指针是对象而引用不是,const 指针必须初始化,值不能改变。不变的是指针本身的值,而不是指针指向的值。

int errnum = 0;
int *const curErr = &errnum;        // 可以通过curErr修改errnum值
const double pi = 3.14;
const double *const pip = π      // 不能通过pip修改pi的值

顶层const

常量指针、const常量(顶层const)和指向常量的指针(底层const)

拷贝操作(赋值等)时,要考虑底层const(指针指向的是否是常量)的限制。

int i = 0;
int *const p1 = &i;  	// 顶层
const int *p2 = &i;		// 底层
const int *const p3 = &i;

2.5 处理类型

定义类型别名

  • typedef
typedef double wages;
typedef wages base, *p;  // p是double*同义词
wages hourly, weekly;
  • using
using SI = sales_item;
SI item;    // = sales_item item;

常量或复合类型的别名带来的歧义:

typedef char *pstring;
const pstring cstr = 0; // cstr: 指向char的常量指针
const pstring *ps;      // ps: 指针,其值是一个指向char的常量指针

cstr类型是指针,对其 const 限定,便是const指针(常量指针),而不是替换类型别名之后的语句
const char * cstr = 0;

auto类型

auto 变量必须有初始值,同时声明多个变量时,所有变量初始数据类型必须一样.

auto i = 0, *p = &i;    // correct
auto sz = 0, pi = 3.14; // wrong

auto忽略顶层const,保留底层const,希望保留const,要明确指出。

int i = 0;
const int ci = i;
auto a = ci;        // a: int 而不是 const int
const auto b = ci;  // b: const int

decltype 类型指示符

decltype 选择返回操作数的数据类型

const int ci = 0, &cj = ci;
decltype(ci) x = 0;     // x: const int
decltype(cj) y = x;     // y: const int&, Y与x绑定
decltype(cj) z;         // 错误,z是引用,必须初始化

decltype中如果变量加了括号,结果将是引用

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

2.6 自定义数据结构

预处理器,头文件保护符

#ifndef
#ifdef
#define
#endif

预处理变量无视C++中关于作用域的规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值