notes/ch02.md
任何常用的编程语言都具备一组公共的语法特征,最基本的特征包括:
大多数编程语言通过两种方式来进一步补充其基本特征:
基本算数类型:
| 类型 | 含义 | 最小尺寸 |
|---|---|---|
bool | 布尔类型 | 8bits |
char | 字符 | 8bits |
wchar_t | 宽字符 | 16bits |
char16_t | Unicode字符 | 16bits |
char32_t | Unicode字符 | 32bits |
short | 短整型 | 16bits |
int | 整型 | 16bits (在32位机器中是32bits) |
long | 长整型 | 32bits |
long long | 长整型 | 64bits (是在C++11中新定义的) |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
int执行整数运算。一般long的大小和int一样,而short常常显得太小。除非超过了int的范围,选择long long。char或bool。double。42的值被称作字面值常量(literal)。
'a'"Hello World"std:cout<<"wow, a really, really long string"
"literal that spans two lines" <<std::endl;
\n、\t等。true,false。nullptr字符串型实际上时常量字符构成的数组,结尾处以
'\0'结束,所以字符串类型实际上长度比内容多1。
变量提供一个具名的、可供程序操作的存储空间。 C++中变量和对象一般可以互换使用。
int sum = 0, value, units_sold = 0;{},如int units_sold{0};C++将声明和定义区分开。声明使得名字为程序所知。定义负责创建与名字关联的实体。extern,如extern int i;。但如果包含了初始值,就变成了定义:extern double pi = 3.14;{}
::reused显式访问全局变量reused。一般说的引用是指的左值引用
int &refVal = val;。int *p; //指向int型对象的指针
是一种 "指向(point to)"另外一种类型的复合类型。
定义指针类型: int *ip1;,从右向左读有助于阅读,ip1是指向int类型的指针。
指针存放某个对象的地址。
获取对象的地址: int i=42; int *p = &i;。 &是取地址符。
指针的类型与所指向的对象类型必须一致(均为同一类型int、double等)
指针的值的四种状态:
对无效指针的操作均会引发错误,第二种和第三种虽为有效的,但理论上是不被允许的
指针访问对象: cout << *p;输出p指针所指对象的数据, *是解引用符。
空指针不指向任何对象。使用int *p=nullptr;来使用空指针。
指针和引用的区别:引用本身并非一个对象,引用定义后就不能绑定到其他的对象了;指针并没有此限制,相当于变量一样使用。
赋值语句永远改变的是左侧的对象。
void*指针可以存放任意对象的地址。因无类型,仅操作内存空间,对所存对象无法访问。
其他指针类型必须要与所指对象严格匹配。
两个指针相减的类型是ptrdiff_t。
建议:初始化所有指针。
int* p1, p2;//*是对p1的修饰,所以p2还是int型
const int ival=1; const int &refVal = ival;,可以读取但不能修改refVal。const double pi = 3.14; const double *cptr = π。int i = 0; int *const ptr = &i;顶层const:指针本身是个常量。底层const:指针指向的对象是个常量。拷贝时严格要求相同的底层const资格。constexpr和常量表达式(▲可选)C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量的表达式。typedef double wages;using SI = Sales_item;(C++11)// 对于复合类型(指针等)不能代回原式来进行理解
typedef char *pstring; // pstring是char*的别名
const pstring cstr = 0; // 指向char的常量指针
// 如改写为const char *cstr = 0;不正确,为指向const char的指针
// 辅助理解(可代回后加括号)
// const pstring cstr = 0;代回后const (char *) cstr = 0;
// const char *cstr = 0;即为(const char *) cstr = 0;
auto sz = 0, pi =3.14//错误int i = 0, &r = i; auto a = r; 推断a的类型是int。顶层const。const int ci = 1; const auto f = ci;推断类型是int,如果希望是顶层const需要自己加constdecltype(f()) sum = x; 推断sum的类型是函数f的返回类型。顶层const。C++11尽量不要吧类定义和对象定义放在一起。如
struct Student{} xiaoming,xiaofang;
struct开始,紧跟类名和类体。C++11:可以为类数据成员提供一个类内初始值(in-class initializer)。const和constexpr变量。预处理器概述:
#include标记时,会用指定的头文件内容代替#include#indef已定义时为真#inndef未定义时为真#ifndef SALES_DATA_H //SALES_DATA_H未定义时为真
#define SALES_DATA_H
strct Sale_data{
...
}
#endif