C++ Primer Chapter2

变量和基本类型

Q:一个类型转换可能产生的错误

赋给有符号的char型变量超出范围的值时,其结果是未定义的(undefined),可能会造成程序崩溃。

signed char c = 256;	// 结果未定义(undefined)

Q:两种情况下的默认初值

定义于任何函数体之外的变量被初始化为0。

定义在函数体内部的内置类型变量(还有指针)将不被初始化,拥有一个不确定的值。

Q:变量的声明和定义

因为C++的分离式编译机制,允许将程序分割成若干个文件,每个文件独立编译。这就需要有文件间共享代码的方法。因此,C++将声明和定义区分开来。

它们的定义如下:

声明(declaration):使名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。

定义(definition):负责创建与名字关联的实体。

几个比较重要的知识点:

  1. 变量的声明规定了变量的类型和名字。除此之外,定义还申请了存储空间,也可能会为变量赋一个初始值。

  2. 如果想声明一个变量而不定义它,使用extern关键字,并且不显式地初始化变量。

    extern int i; // 声明、不定义i
    int j; // 声明并定义j

  3. 变量(在多个文件中)只能被定义一次,但可以(在多个文件中)被多次声明。

Q:(左值)引用和指针

引用本身不是一个对象,引用只能作用于对象,引用就是对象的别名,在定义引用时,程序就把引用和它的初始值绑定在一起(注意绑定和拷贝区分),而且无法重绑到另一个对象上,因此引用必须初始化。

指针本身就是一个对象,允许对指针赋值和拷贝,而且在生命周期内可以先后指向几个不同的对象。无须在定义时赋初值。

Q:void*指针

void指针是个特殊的指针,可以存放任意对象的地址。因为不知道对象的类型,因此不能直接操作void所指向的对象。

作用:

  • 拿它和别的指针比较
  • 作为函数的输入或输出
  • 赋给另一个void*指针

Q:const和引用

对常量的引用(reference to const),一定得用const修饰引用。

const int ci = 1024;

const int &r = ci;		// 引用 及 引用对应的对象 都是常量

对非常量的引用,引用可以是const的也可以是非const的。

int i = 1024;

int &r1 = i;			// 可通过r1修改i的值
const int &r2 = i;		// 不可通过r2修改i的值

Q:指向常量的指针和常量指针

指向常量的指针(pointer to const)

指向常量的指针,一定得用const修饰指针。

const int ci = 1024;

const int *cptr = &ci;

和上面的引用一样,const指针也可以指向非const对象

int i = 1024;

const int *cptr = &i;	// 不能通过该指针改变i的值

常量指针(const pointer)

指针本身是个对象,所以指针本身可以定为常量。因为常量不允许修改,所以常量指针必须初始化,一旦初始化完成,存放在指针内的地址则不再改变。

声明要从右往左阅读。

int i1 = 1024;
int *const ptr1 = &i1;

const int i2 = 2048;
const int *const ptr2 = &i2;

Q:关于别名和const之间的一个易错点

别名指代符合类型,会产生神奇的结果。

typedef char *pstring;
const pstring cstr = 0;		// cstr是指向char的常量指针
const pstring *ps;			// ps是一个指针,它的对象是指向char的常量指针

const修饰的是pstring是指针,是顶层const。

如果把pstring替换进来是

const char* cstr = 0;		// 按照之前学习的,cstr是一个指向char类型常量的指针

const修饰的是char,而*成为了声明符的一部分,是底层const。

Q:auto和decltype

auto会忽略掉顶层const

decltype则包含顶层const和底层const

decltype内是指针解引用,则得到的是引用类型,必须初始化。

decltype内的变量加了括号,则得到的不是变量的类型,也是引用,必须初始化。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值