1. 语言简介
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
标准的 C++ 由三个重要部分组成:
核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
标准模板库(STL),提供了大量的方法,用于操作数据结构等。
编译运行一个C++程序
g++ helloworld.cpp -o helloworld
./helloworld
2. 数据类型
基本的内置类型
类型 | 位 | 范围 | 类型 |
---|---|---|---|
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 | 宽字符型 |
bool | 1 个字节 | 存储值 true 或 false |
typedef 声明
可以使用 typedef 为一个已有的类型取一个新的名字。如下面的语句会告诉编译器,feet 是 int 的另一个名称:
typedef int feet;
枚举类型
enum 枚举名{
标识符[=整型常数,默认为0],
标识符[=整型常数,默认在前一个基础上递增1],
...
标识符[=整型常数]
} 枚举变量;
enum color { red, green, blue } c;
c = blue;
3.变量与常量
C++ 中的变量/函数声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。
您可以使用 extern 关键字在任何地方声明一个变量。虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
#include
using namespace std;
// 变量声明
extern int a, b;
// 函数声明
int func();
int main() {
// 变量定义
int a, b, c;
// 实际初始化
a = 10;
b = 20;
c = a + b;
cout << c << endl;
}
//函数实际定义
int func() {
return 0;
}
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
常量
布尔常量
布尔常量共有两个,它们都是标准的 C++ 关键字:
true 值代表真。
false 值代表假。
不应把 true 的值看成 1,把 false 的值看成 0。
定义常量
在 C++ 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。
#define LENGTH 10
- 使用 const 关键字。
const int LENGTH = 10;
C++ 中的类型限定符
类型限定符提供了变量的额外信息。
限定符 | 含义 |
---|---|
const | const 类型的对象在程序执行期间不能被修改改变。 |
volatile | 修饰符 volatile 告诉编译器,变量的值可能以程序未明确指定的方式被改变。 |
restrict | 由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。 |
4. C++ 存储类
auto 存储类
自 C++ 11 以来,auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
auto f=3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一类型
register 存储类
{
register int miles;//**register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量**
}
static 存储类
#include
// 函数声明
void func(void);
static int count = 10; /* 全局变量 */
//static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁,同java的理解
int main()
{
//sth
}
extern存储类
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
//main.cpp
#include
int count ;
extern void write_extern(); //extern 是用来在另一个文件中声明一个全局变量或函数
int main()
{
count = 5;
write_extern();
}
//support.cpp
#include
extern int count;// extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
mutable 存储类
mutable 说明符仅适用于类的对象,它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。
thread_local 存储类
使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
5.运算符
杂项运算符
运算符 | 描述 |
---|---|
sizeof | sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。 |
, | 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。 |
.(点)和 ->(箭头) | 成员运算符用于引用类、结构和共用体的成员。 |
Cast () | 强制转换运算符把一种数据类型转换为另一种数据类型。例如, c = (int) a; |
& | 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。 |
* | 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。 |