C++ Primer,C++基础

初识输入输出

访问main的返回值

依赖于系统,在unix系统中,使用echo $?;在windows中,使用 echo %ERRORLEVEL%;当return 0 时,状态值为0,当返回值为-1时,unix的状态值为255

输入输出

C++ 的输入输出是由标准库(standard library)来提供IO机制。
iostream库:由istream(输入流)和ostream(输出流)组成。其中一个流代表一个字符序列。

IO对象

标准库中定义了4个IO对象分别是cin,cout,ceer,clog
cin:标准输入
cout:标准输出
cerr:标准错误
clog:输出程序运行时的一般性信息

cout\cerr\clog的区别:

cout:cout流在内存中开辟了缓冲区,用于存储流的数据,当遇到endl时,才输出流中的所有数据。
ceer:ceer与cout的唯一区别是只能输出到显示器
clog:没有缓冲区,只能输出到显示器

endl:操纵符,作用是结束当前行,并将与设备管理的缓冲区中的数据刷入到设备中。

读取数量不定的输入数据

在某些情况下,我们无法得知有多少个数据,需要读取数据直到没有新的输入为止。
可使用下列循环

while(cin << value){ //当使用istream对象作为条件时,会检查流的状态,当遇到文件结束符或无效输入时,istream对象的状态会无效,无效状态为假

}

基本内置类型

1字:4字节或者8字节 PS:记得汇编讲8086的时候说1字为2字节,因此字与系统有关系吧?待考证

如何选择类型
  1. 如何数为正,选用无符号数更好
  2. 使用int执行整数运算,如果超过int,使用long long,因为一般long与int尺寸相同
  3. 算数表达式不使用char/bool,因为类型char在部分机器上有符号,在部分机器上无符号,易出问题。
  4. 执行浮点数运算选用double
long int long long short 的区别

参考:http://blog.sina.com.cn/s/blog_6f62c9510101svjz.html

类型转换
  1. 当给无符号数赋一个超出其表示范围的值的时候,结果为初始值对无符号类型表示数值总数取模后的余数,即mod256
  2. 赋值给带符号类型一个超出其表达范围的值是,结果未定义。——无法预知结果
  3. 无符号数与有符号数进行加运算时,会先把有符号数转换成无符号数。然后相加,当无符号数相减得到负数时,值为负数的绝对值。
变量的声明和定义

声明:使名字为程序所知
定义:负责创建与名字关联的实体,申请空间等等
如果需要声明变量而不定义,则使用关键词extern
tips:能够多次声明,但是只能定义一次。

extern int i,声明 i而非定义
int i 声明并定义i
变量初始化

初始化 != 赋值
初始化:创建变量时赋一个初始值
赋值:把对象的当前值擦除,而以一个新值来替代。

列表初始化 C++ 11新标准

用花括号来初始化变量,被称为列表初始化,特点:当使用列表初始化且初始值存在丢失信息的风险,编译器将报错。例如:

long double ld = 3.1415926;
int a{ld},b = {ld};//错误,转换未完成,存在信息丢失风险
int c(ld),d = ld,//正确并丢失了信息
引用(左值引用)和指针
引用

引用是为对象起了一个新的名字,引用类型引用另外一种类型,引用必须被初始化且无法重新绑定,例如:

int ival = 1024;
int &refVal = ival;
int &refval2 //error,未初始化
指针

指针与引用的相同点:指针也实现了对其他对象的间接访问
区别:
1. 指针本身就是对象,允许对指针赋值和拷贝,并且在其生命周期里可以指向不同的对象
2. 指针无需定义时赋值

声明语句中指针的类型实际上用于指定它所指向对象的类型,所以二者必须匹配

const限定符

const对象一旦创建后便无法改变,因此const对象必须初始化。在默认状态下,const对象仅在文件内有效,编译器在编译的过程中就把相关的const常量替换成值,例如 const int buffsize = 512,就会在编译的过程中把所有的buffsize替换成512.
默认情况下,const对象被设定为仅在文件内有效,如果多个文件中出现了同名的const变量时,等同于不同文件中分别定义了独立的变量。当我们的const常量需要在文件间共享时,可以只在一个文件中定义const,在其他文件中声明并试用它,可以对const变量添加extern关键字,例如:
“`
//file_1.cc 定义并初始化常量,该常量能被其他文件访问
extern const int bufsize = f()
//file_1.h 头文件
extern const int bufsize; 与file_1.cc中定义的bufsize是同一个

##### 常量引用
常量引用是把引用绑定到const对象上。对常量的引用不能修改其值,例如:

const int ci = 1024 //常量
const int &rl = ci; //引用以及对应的对象都是常量,并且无法修改
rl = 42 //错误,rl是对常量的引用
int &rl = cl //错误,非常量引用指向了常量引用,如何该引用合法,那么可以通过rl修改cl的值,

```
常量绑定的过程:
double dval = 3.14;
const int &ri = dval;
等价于
double dval = 3.14;
const int temp = dval;
const int &ri = temp

其中temp为临时量,ri绑定的是一个临时对象。故ri与dval的地址不同,并且ri的值无法修改;考虑下面两种情况:

int i = 42;
int &ri = i * 2;

double i = 3.1415;
int &ri = i;

两种情况都出错,报错信息:invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’,因为这两种情况都会创建临时变量,如果允许该操作,那么则允许对临时变量进行修改。因此该操作是非法的。

const 与 指针
指向常量的指针

指向常量的指针不能用于改变其所指对象的值,如果要存放常量对象的地址,只能使用指向常量的指针。

const double p = 3.14;
double *ptr = &p; //错误,常量对象的地址只能由指向常量的指针存储
const double *cptr = &p;//正确,cptr 指向的是一个双精度常量
*cptr = 42//错误,无法修改指向常量的指针;

double dval = 3.14
cptr = &dval //正常,但是不能通过cptr去改变dval的值;

tips:指向常量的指针和引用,所谓的“自以为是”,他们认为自己指向了常量,自觉的不去改变对应对象的值

常量指针

常量指针:常量指针必须初始化,且初始化化其指向无法改变,但是指向的值能够改变。例如:

int errNumb = 0;
int *const curErr = &errNumb; //curErr一直指向errNumb
const double pi = 3.1415926;
cont double *const pip = &pi,//pip是一个指向常量的常量指针
C++11 新特性
  1. constexpr类型:声明为constexpr的变量一定是一个常量,并且必须由常量表达式初始化。当constexpr定义了指针时,限定符constexpr仅对指针有效,即constexpr int *p,p是一个指向整数的常量指针。
  2. auto类型说明:编译器自动分析表达式所属的类型。

完:2016.6.18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值