C++ Primer(英语第5版) 阅读日记 - 20200415

前言

开始更换到Markdown编辑器了。Typora用户感觉有时候编辑格式,还是用Markdown编辑器更加轻松一点。接上篇。
这个笔记系列主要定位是阅读完C++ primer之后给自己一个回忆的过程,并非是要写一份尽善尽美的教程(太浪费时间)。但我尽量做到废话少,干货多,便于大家和自己查询。
同时,日记目标是做到技术性和语义学并存,去规范化很多我们熟悉的过程:例如什么叫初始化,什么是Object。Bottom up去系统构筑C++ 的认识。
有时候写之前会看看之前的日记,也帮助我回忆很多知识。

Variables

定义形式:A simple variable definition consists of a type specifier, followed by a list of one or more variable names separated commas, and ends with a semicolon.

C++里的Object:是一种约定俗称的说法。宽泛的说,是一块内存空间,存储数据并且拥有类型。而变量(Variable)更多的是用于代表已经命名的对象(Object)。

Initializers

当一个Object创建时,他就被初始化了(Initialized)。
Initialization & assginment: initialization指的是变量被创建并赋值的过程。而assignment指的是将变量当前值替换为一个新的值的时候。

代码样例:

// for variable intialization
double price = 109.99, discount = price * 0.16;
double salePrice = applyDiscount(price, discout);
// for int initialization (distinct ways)
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);

Default Initialization

除了上文显式(explicitly)初始化,还有默认的初始化(default initialized)。他是隐式(implictly)的,即在初始化时候不手动指定初始值。

std:: string empty; // empty implictly initialized to the empty string

Default initialization 在函数外时候,会将变量初始化为0。但是在函数内的时候,他是undefined的:可能出现乱码。

我在2019年在上海科技大学CS101数据结构课就职助教出题的时候,就有同学来投诉说:我的程序为啥在OJ有些点上次能过,下一次就没了,然而程序一次没改。后来check完,发现是同学书写不规范,在函数定义变量时没初始化为0。这点值得当心,是潜在buff来源。

题外话,好的初始化很重要。我算法见长,以前Pascal选手,但Cpp基础薄弱。最近做Leetcode,发现我的初始化很啰嗦,相比官方很简洁。给个例子。

Separatate compilation

独立编译(separate compilation)意味着我们可以将源代码拆分在文件系统的不同文件里,并且独立编译。

为了完成独立编译,我们要分辨declarationdefinition的区别:declaration声明了变量的名称,而非其功能,definition声明了变量对应的功能。这对对于有C++基础的筒子们很好理解:头文件.h和对应实现的.c文件。

但很多情况下,我们之前提到过,会有默认初始化的问题:你给了变量名字,那么实际执行时,就会为其分配空间了。如果我们不想调用默认初始化(default initialize),我们要做的是:

extern int i; // declare but not define
int j;

Identifiers

标识符(Identifiers)通俗来说就是变量的名字,用于标识变量。琐碎的命名规范和避免关键字的问题略过。

Scope of a name

Scope,在中文应叫做作用域,决定了变量名字们(Names)的生命周期,用花括号定义(curly brace)。定义在作用域里的变量,过了作用域就释放掉了,外部不可访问。

在最外面,不在花括号里的names都定义在全局作用域(global scope)。同时作用域可以套娃使用(nested)。就有了inner scope和outer scope的说法。

你可能感兴趣的:(C++)