1
标准输入输出对象:
cin :istream对象,从标准输入读取数据
cout:ostream对象,将数据写入到标准输出,一般用于正常内容的输出。默认情况下,读取cin或程序非正常终止时会刷新cout
cerr:ostream对象,关联到标准错误,输出程序的错误信息,默认情况下写到cerr的数据是不缓冲的。
clog:ostream对象,关联到标准错误,默认情况下写到clog的数据是被缓冲的。
定义在函数内部的内置类型默认是不初始化的,除非有显式的初始化语句,未初始化的变量的值无意义。
2 变量和基本类型
基本内置类型:算数类型和空类型
算数类型:整型(包括字符类型,布尔类型),浮点型
有符号和无符号
1,当赋给无符号类型一个超出其表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。unsigned char c = -1;//c=255,即255%256=255
2,赋给带符号类型一个超出表示范围的值时,结果是未定义的
3,含有无符号类型的表达式中,有符号类型的值会自动转换为无符号类型
字面值常量
20 十进制;024 八进制;0x24 0X24 十六进制
默认情况下,十进制字面值是带符号数,八进制或十六进制不确定;
3.14 ;3.1415E0; 0.;0e0;.001
默认情况下,浮点型字面值是double
'a' 字符字面值
"hello" 字符串字面值
转义序列
指定字面值的类型
初始化不是赋值,初始化是创建变量的同时赋予其一个初始值,而赋值的是把对象的当前值擦除,以一个新值代替。
int a = 0;
int a = {0};
int a{0};
int a(0);
用{}初始化为列表初始化,对于内置类型来说,使用列表初始化若初始值存在丢失信息的风险,编译器会报错。
默认初始化:定义时没有指定初值。如果是内置类型,全局或static变量都被初始化为0,但在函数体内部的局部变量值未定义,不可使用。对于类,由类本身决定其值。
声明规定了变量的类型和名字,定义则还会分配空间(初始化);任何包含了显式初始化的声明即成为定义;
extern double pi = 3.1415;//定义
double pi = 3.1415;//定义
extern double pi;//声明
复合类型:基于其他类型定义的类型,如指针和引用;
引用定义时必须被初始化,是对象的别名,无法重新绑定到另一个对象上。
指向指针的引用
int *p;
int *&r = p;//r是对指针p的引用
const int &r1 = i;//对常量的引用,不可通过r1改变i的值
const int *p;//指向常量的指针
int *const p;//指针常量
const int *const p;
顶层const:表示指针(或任何对象)本身是常量
底层const:表示指针(或引用)指向的对象是一个常量
常量表达式:
值不会改变(const)并且编译过程中就可以得到计算结果的表达式。
将变量声明为constexpr类型,使编译器来验证变量的值是否是一个常量表达式。此变量是常量并且必须用常量表达式来初始化。
constexpr int a = 12;
constexpr int a = func();//当func()是constexpr函数时,成立
constexpr指针的初始值必须是nullptr或0,或存储于固定地址中的对象。constexpr引用的初始值必须是固定地址中的对象。
constexpr int *p = nullptr;//constexpr修饰p
类型别名:某类型的同义词,简化类型的表示
typedef double othername;
using othername = double;
typedef double *p;//p的类型是double*
例如:
typedef char *pstring;
const pstring cstr = 0;//cstr 是指向char的常量指针
const pstring *p;//p指向一个指向char的常量指针,不可简单的把pstring展开代入来理解,const修饰pstring,而pstring首先是一个指针
auto 类型说明符
1,auto定义变量必须有初始值,编译器根据初始值推断类型
2,同一条语句声明多个变量,这些变量的初始值的类型必须一样
3,使用引用初始化auto定义的变量,实际上是用引用的对象初始化,则推断为引用的对象的类型
4,auto一般会忽略顶层const,保留底层const。const auto f = ci;//显式顶层const
decltype类型指示符
使用表达式的类型推断类型。
1,decltype(f()) sum;//使用函数的返回值类型
2,decltype(x) sum;//使用变量的类型,注意不可忽略const和引用类型
3,如果表达式的内容是解引用操作,则decltype得到引用类型
decltype((x)) d=y;//d是x的引用类型
decltype(x) d;//只有当x本身是引用类型,d才是引用类型
命名空间的声明
using namespace::name;
using namespace space_name;
头文件不应该包含using声明,避免包含此文件的源文件和using声明的名字冲突
标准库string类型
可变长字符序列
#include
using std::string;
从流中读取时会忽略空白字符(空格符,换行符,制表符等)
getline从流中读取一行,遇到换行符为止(换行符也读进来了),但换行符不会存到对象中。
string::size_type,类中定义的类型,无符号,可存下任何string对象的大小,可使用auto或decltype推断。
字面值和string对象相加,必须确保运算符两侧至少一个是string对象。字符串字面值不是string类型。
[]返回的是某位置上字符的引用。
#include
基于范围的for循环
for (declaration : expression){
statement
}
标准库类型vector
#include
using std::vector;
vector