C++Primer第五版一书中,个人笔记。先更前两章
第 1章 开始
函数定义包括四个部分返回类型,函数名,函数体,形参列表。
IDE 集成开发环境。
cin 和cout 标准输入和标准输出。cerr 标准错误输出警告和错误信息。 clog 输出程序运行时的一般消息。<< 输出运算符。>>输入运算符。操纵运算符endl,结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。
初始化:在变量创建的同时为它赋予一个值。
注释界定符/* */ 不能嵌套。复合赋值运算符+= 前缀递增运算符++
istream效果是检测流的状态。输入文件结束符ctrl+z,或者无效输入时,istream对象的状态会变为无效。
编译器不能检查一个程序是否按照作者的意图工作,但可以检查形式上的错误。语法错误,类型错误,声明错误。
类来定义自己的数据结构。一个类定义了一个类型,以及与其关联的一组操作。
点运算符,左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名。调用运算符()。
第 2章 变量和基本类型
wchar_t 宽字符,char16_t 、char32_t Unicode 字符、float单精度浮点数、double双精度浮点数、long double 扩展精度浮点数。通常选用double。
可寻址的最小单位称为字节。存储的基本单元称为字(指的是32位或64位机器)。
字符类型被分为三种:char、signed char 和unsigned char。类型char实际上会表现为上述两种形式的一种,具体是由哪种编译器决定。8比特的unsigned char 表示0~255,signed char理论表示-127~127,实际上-128 ~ 127。
当我们对一个带符号类型超出范围则称为未定义。
混用带符号数与无符号类型,带符号数会自动地转换成无符号数。
字符串字面值的类型实际上是由常量字符构成的数组。编译器会在每个字符串的结尾处添加一个空字符 \0。
指定字面值类型 例如:L’a’ – 宽字符型字面值。p37
对象通常情况下是指一块能存储数据并具有某种类型的内存空间。
初始化和赋值是两个完全不同的操作。
列表初始化 { }。强制转换使用( )。默认初始化在函数体外的变量被初始化为0,在函数体内则不被初始化,即未定义的 。这类值被拷贝或访问将引发错误。
声明使名字为程序所知,一个文件如果想使用别处定义的名字必须包含对那个名字的声明。
定义负责创建与名字关联的实体。除声明外,还将申请储存空间也可能会为变量赋一个初始值
extern int i ;//声明i而非定义i
int i ; //声明并定义j
任何包含显式初始化的声明即成为定义。
:: 作用域操作符左侧为空时,即获取全部作用域。
#include <iostream>
int reused =42;
int main()
{
int reused = 0;
std::cout<<::resued; //全局作用域的resued
}
引用必须被初始化。引用并非对象,它是一个已经存在的对象所起的另外一个名字。
引用类型的初始值必须是一个对象。
指针和引用类似,也实现了对其他对象的间接访问。不同点:指针本身就是要给对象,允许对指针赋值和拷贝。第二,指针无须在定义时赋初值。
错误:把double类型对象的地址赋给int指针。不能把int__变量__直接赋给指针
指针的值即地址。空指针nullptr,过去的程序使用NULL的预处理变量。需#include cstdlib
void* 是一种特殊的指针类型,可用于存放任意对象的地址。不能对void*直接操作,我们也不知道这个对象是什么类型将引发错误。
int* p; //合法但是容易产生误导。基本类型是int,而非int*
const 限定符。const对象必须初始化。
const int i = get_size(); //运行时初始化
const int j = 42; //编译时初始化,编译器将在编译过程把用到该变量的地方都替换为对应的值
如果多个文件之间想共享const对象,则需要在const前加extern
const int ci = 1024;
const int &r = ci; //常量引用,类型要一致
double dval;
const int &ri = dval; //非法
编译器会将代码变为:
const int temp = dval;
const int &ri = templ;
底层const 指向常量指针:值不能改变,指针值(地址)可以改变
const double pi = 3.14;
double *ptr = pi; //错误
const double *pr = ptr; //正确,指向常量指针
double dval = 3.14;
pr = &dval; //正确
顶层const 常量指针:指针的值不可以改变
常量表达式constexpr:值不会改变,且在编译过程中就能得到计算结果。
const int sz = get_size(); //sz不是常量表达式,运行时才可以获取值
constexpr int mf = 20; //常量表达式
一个constexpr指针的初始值必须是nullptr和0。或者是存储于某个固定的对象。函数体之外的可以定义为constexpr
类型别名 typedef。别名声明:
using SI = Sales_item; //SI是Sales_item的同义词
typedef cahr *pstring ;
const pstring cstr = 0; //指向的是常量指针,不是指向常量的指针
auto让编译器通过初始值来推断变量的类型。auto定义的变量必须由初始值。
auto sz = 0, pi = 3.14; //错误:类型不一致
decltype作用是选择并返回操作数的数据类型。包括顶层const和引用在内。引用必须初始化
decltype的表达式如果是加上了括号变量,结果必将是引用。
decltype((i)) d; //d是引用,必须初始化
struct 需要在大括号外加分号