本文假定你有基本的C语言知识,由于从第一章到底十八章的笔记已经全部写完,因此我会在整理好后直接发上来;
C++ Primer Plus 非常适合初学的人,如果已经用过C++建议可以直接去看C++ Primer这本书,而C++ Primer Plus这本书对于有经验的C++开发者可以快速翻阅,主要看自己不懂的地方,顺便做做后面的练习题;
第一章 预备知识
- C++包括:
- C语言代表的过程性语言
- C语言基础上新增的面向对象编程
- C++模板支持的泛型编程
-
C面向过程 – 注重算法,采用自上向下的编程模式
C++面向对象 – 面向数据,采用自下向上的编程模式 -
4.3版本后的g++要使用C++11的特性应如下操作:
g++ -std=c++0x main.cpp
-
有些编译器仅当被明确指示后,才会搜索数学库,如较早的g++版本需要如下命令:
g++ structfun.c -lm
-
C++文件扩展名一览:
第二章 开始学习C++
- 命令行模式下,要让窗口一直打开的方法:
- 使用
cin.get();
直到输入任意字符 - 使用
system("pause");
直到输入任意按键
main()
如果不定义return 0语句,则隐含包括了一个return 0;
语句,其他函数除外;默认情况下,返回 0 表示程序运行成功,非零则表示存在问题;- 函数参数为空,C++中默认为 void 类型,而C语言则只表示对是否接受参数保持沉默;
- C++以
//...
表示注释,也可用C语言的注释方式/* ... */
,不过应尽量使用C++的注释方式,此方式不容易产生错误; - C++预处理类似于C语言,如
#include <iostream>
(表示用编译时用 iostream 文件内容代替此编译指令,C语言的头文件可以这样使用#include <cstdio>
或者#include "stdio.h"
; 命名空间
是为了区分不同代码框架下具有相同函数名的函数;iostream
表示标准输入输出头文件;cin
和cout
都属于iostream
的类实例,cout
面向对象特性,其重载了<<
运算符,因此便于输出各种不同类型的数据;endl
确保程序继续运行前刷新输出,而\n
则不保证这样,可能会在输入信息后显示;
cin cout其他设置
cout<<hex; cout<<dec; cout<<oct
分别表示输出16进制、输出10进制、输出8进制;- cout 默认会删除浮点数结尾的零,而调用
cout.setf()
将取消这种行为;cout.setf(ios::boolalpha)
输出bool变量时显示true和false而不是1和0;setf(ios_base::fixed)
将对象至于使用定点数的模式;setf(ios_base::showpoint)
将对象至于显示小数点的模式,即使小数部分为0;方法precision()
指定显示多少位小数;方法width()
设置下一次输出操作的字段宽度,但只在下一次有效,然后恢复默认,默认为0,意味着刚好能容下要显示的内容;
第三章 处理数据
- 信息要存储需要知道:
- 存在哪
- 存什么值
- 存的类型
C++变量命名及初始化
- 变量命名规则:
- 名称只能使用
字母字符
、数字
、下划线
- 名称
第一个不可以是数字
区分大小写
不能使用C++关键字(保留字)
- 两个下划线或下划线+大写字母的名称被留给实现使用(编译器及其使用的资源);一个下划线开头的名称被保留给实现,用作全局标识符;如果使用这样的变量名(如_time)不会导致编译器错误,但会导致行为不正确
- C++对于名称长度无限制,但有些平台有限制;ANSI C(C99标准)只保证前63个字符有意义
- 变量初始化:
- C语言方法:
int a = 1;
或者int a = {1};
在C++98也是可行的 - C++独有方法:
int a(1);
或者int a{1};
如果括号不包含任何东西,则默认初始化为0
- 整型和浮点型统称为算术类型
C++基本数据类型 – 整形
char , short , int , long , long long(C++11新增)
,其中还分为有符号singed
和无符号unsigned
两种;对这些类型的基本要求如下,这些定义根据不同系统各不相同,头文件climits(老式实现中为limits.h)
包含了关于整形的限制信息,如下图所示;通常int类型的长度
被设置为“自然”的长度,即计算机处理起来效率最高的长度;
char
为一个字节int
至少与short
一样长long
至少32位,且至少与int
一样长long long
至少64位,且至少与long
一样长
8bit = 0 ~ 256 或者 -128 ~ 127
16bits = 0 ~ 65536 或者 -32768 ~ 32767
32bits 最长 4 294 672 296 个值
64bits 最长 18 446 744 073 709 551 616 个值
-
无符号和有符号整数超过最大值或最小值时将会上溢或下溢,如下图所示
-
整型常量,0x开头表示十六进制,0开头表示8进制,没有开头表示十进制;整数后面带
L
后者l
后缀的表示为long
型,带u
或者U
后缀的表示unsigned int
类型,ul(大小写任意)
表示unsigned long
型,C++提供了ll
或LL
表示long long
型、ull Ull uLL ULL
表示unsigned long long
型
-
字符常量:使用单引号引起来;转义序列如下图;
-
通用字符名类似于转义序列,通用字符名以 \u 或 \U 打头,\u后面8个16进制位,\U后面16个16进制位,这些位表示的是字符的ISO 10646码点,这就扩展了原字符集;
-
Unicode也提供了一种表示各种字符集的解决方案,且ASCII为Unicode编码的子集
-
char型在默认情况下不区分有无符号
,是否有无符号由C++实现决定,确保编译器开发人员将这种类型和硬件属性匹配起来; -
对于大型字符集的表示有两种方法:
1.将char定义为16位或更长的字节
2.使用2字节的wchar_t类型
,此类型与另一种整形(底层underlying类型)的长度和符号属性相同;不能使用cin和cout来输出wchar_t数据,cin和cout将其看为char流数据,可以使用wcin
和wcout
来处理wchar_t数据流 -
C++11 新增了
char16_t
和char32_t
,两者都为无符号类型;使用前缀u
表示char16_t类型,使用前缀U
表示char32_t类型,如u'C'
,U"be good"
;与wchar_t一样,char16_t和char32_t也都有底层类型,此底层类型跟随系统变化; -
布尔型
bool
变量的值可以为true
或false
;过去C++和C都将非零值解释为true,将0解释为false,因而字面值true可以通过提升转换为int值1,而false转换为int值0,反过来任何数值或者指针值都可以隐式转换为bool值
C++常量及const限定符
- 定义常量类型,C语言使用
#define
定义常量,编译时将所有出现的常量名替换为定义的内容,C++新增了const
限定符来定义常量,定义好后就不可修改;定义常量一般将常量名首字母大写;const声明时就要进行初始化,否则该常量值不确定且不可修改; const相比于#define的优势:
能够明确指定类型
通过作用域将定义限制在特定的函数或文件中
可以将const用于更复杂的类型
- 为防止函数修改内容,可以使用const修饰参数;
const数据和非const数据的地址可以赋给指向const的指针,但只能将非const数据的地址赋给非const指针,因此尽量使用const修饰指针参数
;使用const引用使函数能够正确生成并使用临时变量;
C++基本数据类型 – 浮点型
- 浮点数基于二进制,缩放因子是2,可以用
小数点法
(0.12345)示可以用E表示法
(1.2345E-1),E表示法确保数字以浮点格式存储,既可以使用E也可以使用e,但数字中不能有空格; - 浮点类型:
float
,double
,long double
,有效位指数字中有意义的位,float至少32位,double至少48位且不少于float,long double至少和double一样多,三种类型有效位数可以一样多,通常float 32位
,double 64位
,long double 80、96或128位
,这三种类型的指数范围至少是-37 - 37,可从头文件cfloat
查看;float确保至少有6位有效位,而double确保至少有15位有效位
; - 浮点常量,
一般的浮点数都是double类型,加了后缀f或者F的位float类型,加了后缀l或者L的为long double类型
C++算术运算符及其优先级和结合性
- C++算术运算符:
+ - * / %
;运算符重载 运算符优先级和结合性
如下;
C++的类型转换
- C++自动进行类型转换的情况:
将一种算术类型的值赋给另一种算术类型的变量
表达式中包含不同的类型时
将参数传递给函数时
- 潜在的数值转换问题:
- 将较大的浮点类型转换为较小的浮点类型(如double->float),将导致精度降低且有可能超出目标类型范围
- 将浮点型转化为整形,将导致小数部分丢失且有可能超出目标类型范围
- 将较大整形赋值给较小整形,将有可能导致超出目标类型范围
- 整形提升:
bool、char、unsigned char、signed char、short值转换为int型
;- 如果
short和int一样长
,则unsigned short 转换为unsigned int
wchar_t
被转换为第一个宽度足够存储的类型:int、unsigned int、long、unsigned long
- 有符号类型级别从高到低为:long long、long 、int、short、signed char,无符号排序与有符号相同,类型char、unsigned char、signed char级别相同,类型bool级别最低,wchar_t、char16_t、char32_t的级别与其底层类型相同
C++校验表:
(1) 一个操作数为long double,其他转换为long double;
(2) 否则,有一个为double,其他转换为double;
(3) 否则,有一个为float,其他转换为float;
(4) 否则,所有操作数都是整形,进行整形提升;
(5) 如果都是有符号或无符号整形,将级别低的整形提升为级别高的整形,如:unsigned int , unsigned short =>unsigned int;
(6) 一个有符号,一个无符号,且无符号级别高于有符号,则有符号变为无符号所代表的的类型,如:unsigned int , signed short => unsigned int;
(7) 否则,有符号可以代表所有无符号的取值,无符号转换为有符号所属类型,如:int , unsigned char => int;
(8) 否则,两个操作数都转换为有符号类型的无符号版本,如:int , unsigned int => unsigned int。
- 强制类型转换:C语言采用**
(typeName)value
方式;C++新增typeName(value)
方式,主要为了向类方法样式靠拢;static_cast<typeName> (value)
**是C++引入的更为严格的一种强制转换方式;
C++中的auto声明
- **
auto
**可以让编译器根据初始值推断变量类型
,如:auto a = 3,则a为int型,这属于C++11的新特性,C++98表示变量的存储方式,详细见后面章节;