简介

C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点
C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。


C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:

  • 封装
  • 数据隐藏
  • 继承
  • 多态

标准的 C++ 由三个重要部分组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。

如果您使用的是 Linux 或 UNIX,请在命令行使用下面的命令来检查您的系统上是否安装了 GCC:
$ g++ -v
windows下使用gcc -v和g++ -v好像是一样的(推荐g++)


基础语法

一个简单的cpp代码

  1. #include <iostream> //定义头文件,类似于java中的import,用于引入一些需要使用的方法之类的
  2. using namespace std; //告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念
  3. int main() // main() 是程序开始执行的地方
  4. {
  5. cout << "Hello World"; // 输出 Hello World return 0;
  6. }

命令行编译运行cpp程序:

  1. 代码保存为?.cpp文件
  2. 命令行进入文件目录,g++ ?.cpp 命令编译,无错则生成.out文件
  3. 之后输入 ?.out 运行

c++程序编写步骤为编辑,编译,连接,运行 编译将cpp转为obj,连接将obj转为exe
块是一组使用大括号括起来的按逻辑连接的语句


whie这些本应该填关系运算符,这些关系运算符就是一个语句。所以也可以写赋值语句,这样可能会陷入死循环。关系运算符本身也是先执行然后返回一个0/1,然后决定循环是否下去

标识符

一个标识符

  • 以字母 A-Z 或 a-z 或 下划线 _ 开始
  • 后跟零个或多个字母、 下划线和 数字(0-9)。

C++ 标识符内不允许出现标点字符,比如 @、$ 和 %。
C++ 是区分大小写的编程语言。
c++中的关键字(保留字)不能作为标识符


注释

单行 //... 或者 /* ... */
多行 /* ... */


变量

变量除了7种基本数据类型,还有枚举、指针、数组、引用、数据结构、类等等

变量声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
使用关键字extern**,例如**extern int a, b;
变量声明实际上没什么用,就是提前告诉编译器有这么一个变量


typedef 声明
可以使用 typedef 为一个已有的类型取一个新的名字
例如typedef int feet;之后feet a就等同于int a

也可以定义指针
typedef long int *pint32;
pint32 x, y, z;
x, y 和 z 都是指向长整型 long int 的指针。


函数声明
int func();,而实际函数定义在后面int func(){...};也是在定义函数前提前告诉编译器有这么一个函数


变量作用域

作用域是程序的一个区域,一般来说有三个地方可以声明变量:

  • 在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用
  • 在函数参数的定义中声明的变量,称为形式参数。
  • 在所有函数外部声明的变量,称为全局变量。全局变量可以被任何函数访问。

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
(这跟java一样,只不过java只有静态成员变量可以直接输出,但是也会被局部变量覆盖)

  1. public class Test {
  2. static int s=6;
  3. public static void main(String []args) {
  4. int s=10;
  5. System.out.println(s); //结果为10
  6. }
  7. }

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

数据类型 初始化默认值
int 0
char ‘\0’
float 0
double 0
pointer NULL

常量

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,常量的值在定义后不能进行修改

整数常量

  1. 整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
  2. 整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

212 // 合法的
215u // 合法的
0xFeeL // 合法的 ,既有前缀又有后缀
078 // 非法的:8 不是八进制的数字
032UU // 非法的:不能重复后缀

浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。

  • 当使用小数形式表示时,必须包含小数点、指数,或同时包含两者。
  • 当使用指数形式表示时,必须包含整数部分、小数部分,或同时包含两者。带符号的指数是用 e 或 E 引入的。

下面列举几个浮点常量的实例:
3.14159 // 合法的
314159E-5L // 合法的
510E // 非法的:不完整的指数
210f // 非法的:没有小数或指数
.e55 // 非法的:缺少整数或分数

布尔常量

布尔常量共有两个,它们都是标准的 C++ 关键字:

  • true 值代表真。
  • false 值代表假。

我们不应把 true 的值看成 1,把 false 的值看成 0。

字符常量

字符常量是括在单引号中。如果常量以 L(仅当大写时)开头,则表示它是一个宽字符常量(例如 L’x’),此时它必须存储在 wchar_t 类型的变量中。否则,它就是一个窄字符常量(例如 ‘x’),此时它可以存储在 char 类型的简单变量中。
字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。
在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:

转义序列 含义
\\ \ 字符
\‘ ‘ 字符
\“ “ 字符
\? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 与cout使用时=endl 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数

下面的实例显示了一些转义序列字符:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout << "Hello\tWorld\n\n";
  6. return 0;
  7. }

当上面的代码被编译和执行时,它会产生下列结果:
Hello World

字符串常量

字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
您可以使用空格做分隔符,把一个很长的字符串常量进行分行。
下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。

  1. "hello, dear"
  2. "hello, \
  3. dear"
  4. "hello, " "d" "ear"

**

定义常量

定义常量使用的关键字(常量名称)一般都用大写

  • 使用 #define 预处理器。

#define LENGTH 10 不需要分号,一般写在声明命名空间语句的后面

  • 使用 const 关键字。

const int LENGTH = 10;写在函数体内部

数据类型

七种基本的 C++ 数据类型:

类型 关键字
布尔型 bool
字符型 char
整型 int
浮点型 float
双浮点型 double
无类型 void
宽字符型 wchar_t
类型 范围
char 1 个字节 -128 到 127 或者 0 到 255
unsigned char 1 个字节 0 到 255
signed char 1 个字节 -128 到 127
int 4 个字节 -2147483648 到 2147483647
unsigned int 4 个字节 0 到 4294967295
signed int 4 个字节 -2147483648 到 2147483647
short int 2 个字节 -32768 到 32767
unsigned short int 2 个字节 0 到 65,535
signed short int 2 个字节 -32768 到 32767
long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int 8 个字节 0 to 18,446,744,073,709,551,615
float 4 个字节 +/- 3.4e +/- 38 (~7 个数字)
double 8 个字节 +/- 1.7e +/- 308 (~15 个数字)
long double 16 个字节 +/- 1.7e +/- 308 (~15 个数字)
wchar_t 2 或 4 个字节 1 个宽字符

从上表可得知,变量的大小会根据编译器和所使用的电脑而有所不同。
sizeof() 函数可以用来获取各种数据类型的大小。如
cout << "Size of long int : " << sizeof(long int) << endl;
输出Size of long int : 4

枚举类型

枚举类型声明一个可选的类型名称和一组标识符,用来作为该类型的值。其带有零个或多个标识符可以被用来作为该类型的值。每个枚举数是一个枚举类型的常数。
enum color { red, green, blue } c;
c = blue;
emmu为声明枚举的关键字,color为整个枚举类型的名称。{ }内为一系列枚举类型的名称 ,c为声明的一个变量
上面的代码定义了一个颜色枚举,变量 c 的类型为 color。最后,c 被赋值为 “blue”。


默认情况下,枚举的第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。
但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。
例如,在下面的枚举中,green 的值为 5。
enum color { red, green=5, blue };
在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1。


C++ 中的左值(Lvalues)和右值(Rvalues)
左值可以出现在赋值号的左边或右边。
右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
如变量是左值,而字面值(如100)是右值。
所以int a=100有效,而100=20错误,因为100是右值不能出现在赋值号左边


类型转换

隐式类型转换(又名自动类型转换)
int --->unsigned --->long --->double --->long double
^ ^
| |
short,char float
char转int,转为ASCII数值
同级的,一起转为兼容的更高级。如char,float运算,都转为long型

强制类型转换
(类型) 表达式/值 或者是 类型 (表达式/值)
比如cout<<int('a'); cout<<(int)'a';

函数

定义函数:
返回值 函数名(参数) { 函数体 }
声明函数:告诉编译器函数名称及如何调用函数
返回值 函数名(参数);

函数可以不止一个返回值,但是只能有一种返回值类型。一个return语句一次只能返回一个值

声明函数
当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。
当在同一个文件中,调用函数的语句在函数定义之前时,也是需要声明函数的
声明函数应该在调用函数的文件的顶部。

函数声明是一个语句,应该结尾加上分号
函数声明只要指定返回值,参数列表即可 比如int fun(int b);

函数参数即形式参数,形式参数就像函数内的其他局部变量,但是会在进入函数时被创建,退出函数时被销毁。

函数参数可以选择一个默认值,当调用函数时,如果实际参数的值留空,则使用这个默认值。
比如int sum(int a, int b=20){...} int main(){int a=10;int b;cout<<sum(a,b)<<endl;}
实际参数b没有初始化,调用sum()会自动给b赋予默认值20;

调用函数

调用类型 描述
传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用 该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用 该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

字符串

C++ 提供了以下两种类型的字符串表示形式:

  • C 风格字符串
  • C++ 引入的 string 类类型

c风格字符串char greeting[] = "Hello";cout << greeting << endl; //输出Hello
char类型字符串初始化必须在在定义时一起,否则之后只能以数组的形式写入字符
而且直接定义和初始化一起【】内大小就默认为字符串长度,否则只定义不初始化就是个数组,定义时就必须写明大小
字符串实际上是使用 null 字符 ‘’ 终止的一维字符数组。

string类有些string类对象特有的方法,比如find,返回查找到的字符串在主串中的位置

C++ 中有大量的函数用来操作以 null 结尾的字符串,要使用以下函数需要#include <cstring>

1 strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2 strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);
返回字符串 s1 的长度。
4 strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回大于 0。
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

String字符串
用法跟java字符串差不多,**注意java里面定义字符串是String,cpp里面是小写string
要使用string类型字符串需要#include<string>
string支持以上所有操作**

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main ()
  5. {
  6. string str1 = "Hello";
  7. string str2 = "World";
  8. string str3;
  9. int len ;
  10. // 复制 str1 到 str3
  11. str3 = str1;
  12. cout << "str3 : " << str3 << endl;
  13. // 连接 str1 和 str2
  14. str3 = str1 + str2;
  15. cout << "str1 + str2 : " << str3 << endl;
  16. // 连接后,str3 的总长度
  17. len = str3.size();
  18. cout << "str3.size() : " << len << endl;
  19. return 0;
  20. }

输入输出

标准输出流(cout)
标准输入流 (cin)
标准错误流(cerr)
标准日志流(clog)
这四个流对象都属于IO库里的头文件。
除了cin使用流提取运算符>>,另外3个都使用流插入运算符 <<;
int a,b;
cin>>a>>b;``这样即可实现给a,b赋值
cerr和clog和cout用法都完全一样,但是在编写和执行大型程序时,它们之间的差异就变得非常明显。所以良好的编程实践告诉我们,使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出。

格式控制方法

使用以下2个方法需要引入iomanip.h文件
setw(int n)用来控制输出间隔 输出n个填充字符。默认填充字符为空格
setfill(char ‘?’) 配合setw使用,设置填充字符(将setw默认的空格填充字符换为其他字符),使用时在setw前用
比如cout<<'s'<<setfill('*')<<setw(8)<<'a'<<endl;输出s********a