The basic of basic
cin,cout,cerr,clog
作用域运算符 ::
while(cin >> data)
返回的是istream,但存在istream到bool的类型转换,读入失败或结束时相当于false
引用运算符 &
文件重定向
helloworld <infile>outfile
静态/动态数据类型语言
动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远不给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来,比如Python和Ruby就是一种典型的动态类型语言。
静态类型语言与动态类型语言相反,它的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表。
无符号数衡正
指定字面值的类型
增加前后缀 wchar_t ch= L'c';
变量初始化
函数体外,初始化为0;函数内置型变量不被初始化。
声明
extern int num; //可能在别处定义
变量和基本类型
复合类型
声明语句 = 基本数据类型 + 声明符
如“int *p”,“*”为声明符
引用:别名,必初始化,与对象绑定,可直接修改,操作同步。
指针:void指针,转换类型后才能操作
int *p;
int *&r = p;
理解r的类型,从右向左阅读r的定义,离r最近的&有直接影响,故r为引用,是一个指针的引用
int i = 42; int *p; int *&r = p; r = &i; //另p指向i *r = 0; //将i的值改为0
const
必须初始化,不能修改
使用extern共享访问
extern int bufSize = init();
extern int bufSize;
不能作为一般常量的引用
int &r = bufSize;
常量引用范围很广,可以有类型转换
int i = 42; const int &r1 = i; const int &r2 = 43; const int &r3 = r1 * 2; int &r4 = r1 * 2; //错误!
常量对应常量指针,看这个例子
int num = 10; const int connum = 100; int *const r1 = # //r1一直指向num const int *r2 = &connum; //指向常量对象的指针
称r1为顶层常量,表示指针本身是个常量,r2为底层常量,表示指向的对象是个常量。
constexpr
将变量或指针定义为顶层常量,可以使用constexpr函数来初始化constexpr函数,
constexpr int size();
constexpr in sz = size();
constexpr引用也能绑定到局部静态变量上。
constexpr定义的指针,只对指针有效,对指针指向的变量无效。
vs不支持这一关键字
类型别名
typedef double newdouble, *douptr; //doubptr等价于double *
using newdouble = double; //vs2010不支持??
注意:
typedef char *pchar;
const pchar pstr = 0; //一个指向char的常量指针
const char *pstr = 0; //一个指向const char的指针
auto
自动识别变量类型
auto i = 0; //type(auto) == int
忽略顶层常量,额外添加const
const int num = 10;
const auto i = num;
auto j = num, *n = # //错误,前后不一致
decltype
decltpye(X) sum = Y; sum的类型与X相同,X甚至可以为函数,此时sum类型即为X的返回值类型。
X若为解引用操作,如
int i = 10, *p = &i;
decltype(*p) c;
此时c的类型为int&。
另外,对于decltype((X)) c,无论X为什么,c的类型都是引用,必须初始化。
预处理器
头文件包含的唯一性
#ifndef MY_HEADER_H #define MY_HEADER_H #include<iostream> int main() /* * ...... */ #endif