【第一章】
书店程序核心:
if 语句例子
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal) {
int cnt = 1;
while (std::cin >> val) {
if (val == currVal)
++cnt;
else {
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
}
return 0;
}
(书上的例子又有错…无语…此程序只能显示第一个出现的次数…还没想怎么改)
【第二章】
· 当知晓数值不可能为负时,选用无符号类型
[引用]:
定义引用时,把引用和初始值绑定在一起,不是把初始值拷贝给引用,无法让引用重新绑定到另一对象。引用只是为已经存在的对象起另一个名字。
·引用必须初始化!初始值也必须是对象,而不是具体的数值。
[指针]:
写法1:修饰符和变量标识符写在一起 int *p1, *p2;
写法2:修饰符和类型名写在一起,每条语句只定义一个变量。 int* p1; int* p2;
·新标准下最好用nullptr初始化指针
void* 指针——存放任意对象的地址,缺点是不知道是什么类型的指针,不能直接操作它所指向的对象。
·指向指针的引用
int i = 42; int *p; int *&r = p;//r为引用。从右往左,离变量名最近的符号
[const]:
默认状态下,const对象仅在文件内有效,所以想在多个文件之间共享const对象,必须在变量的定义前加 extern关键字
extern const int bufSize = fcn();
const的引用:允许为一个const引用绑定非常量的对象、字面值
int i = 42;
const int &r1 = i;
const int &r2 = 42;
const int &r3 = r1 * 2;
int &r4 = r1 * 2;// 错误,r4是非常量引用
const 的引用 对于引用对象本身是不是常量未作限定,所以对象可由其他途径被改变其值
int i = 42;
int &r1 = i;
const int &r2 = i;//不允许通过r2修改i的值
r1 = 0;//i的值被修改为0
r2 = 0;//错误,r2是常量引用
const引用 可以引用一个非const的对象
指向常量的指针 可以指向非常量对象
常量指针: *const 必须初始化,则其值(指针中的地址)不能再改变,不变的是指针的值 不是指向的那个值
顶层const:指针本身是个常量[总结:初始化const 、const指针 、constexpr指针 是顶层const]
const int ci = 42;//顶层const
int i = 0;
int *const p1 = &i;//顶层const
constexpr int *p3 = &ci;//顶层const
底层const:指针所指对象是个常量[总结:const的引用 、指向const的指针 是底层const]
const int *p2 = &ci;//底层const
const int &r = ci;//底层const
·用constexpr来声明一个常量表达式
·类型别名定义 typedef 新标准中使用 别名声明using
typedef char *pstring;
const pstring cstr = 0;//指向char的常量指针
注: 不能将类型别名替换成原来样子理解
const char *cstr = 0;//声明了指向const char的指针
(auto decltype 略看了…)
·auto 类型说明符——让编译器替我们分析表达式所属的类型,auto定义的变量必须有初始值
·decltype 类型指示符——另一种类型说明符,选择并返回操作数的数据类型,不实际计算表达式的值
·预处理器中,头文件保护符依赖于预处理变量,预处理变量两种状态:已定义 未定义
#define 把一个名字设定为预处理变量
#ifdef 变量已定义为真
#ifndef 变量未定义为真。检查结果为真则执行后续操作直到遇见 #endif
有效的防治了重复包含的发生