C++ 基础语言:
/* 多行注释 */ //单行注释
1.程序开始
#include <iostream>
using namespace std;
int main()
cout << "Hello, world!" << endl;
return 0;
}
2.C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性: 封装 抽象 继承 多态
标准的 C++ 由三个重要部分组成: 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
C++ 标准库,提供了大量的函数,用于操作文件、字符串等。标准模板库(STL),提供了大量的方法,用于操作数据结构等。
3.g++ 常用命令选:
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串"1"定义 MACRO 宏。
-DMACRO=DEFN 以字符串"DEFN"定义 MACRO 宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
4.C++关键字: https://www.runoob.com/w3cnote/cpp-keyword-intro.html
5.基本的内置类型 基本的 C++ 数据类型:
布尔型 bool: 所占字节数:1 最大值:1 最小值:0
字符型 char: 所占字节数:1 最大值: 最小值:?
整型 int: 所占字节数:4 最大值:2147483647 最小值:-2147483648
浮点型 float: 所占字节数:4 最大值:3.40282e+38 最小值:1.17549e-38
双浮点型 double: 所占字节数:8 最大值:1.79769e+308 最小值:2.22507e-308
无类型 void
宽字符型 wchar_t: 所占字节数:4 最大值:2147483647 最小值:-2147483648
signed char: 所占字节数:1 最大值: 最小值:?
unsigned char: 所占字节数:1 最大值:? 最小值:
short: 所占字节数:2 最大值:32767 最小值:-32768
unsigned: 所占字节数:4 最大值:4294967295 最小值:0
long: 所占字节数:8 最大值:9223372036854775807 最小值:-9223372036854775808
unsigned long: 所占字节数:8 最大值:18446744073709551615 最小值:0
long double: 所占字节数:16 最大值:1.18973e+4932 最小值:3.3621e-4932
size_t: 所占字节数:8 最大值:18446744073709551615 最小值:0
string: 所占字节数:24
wchar_t=> typedef short int wchar_t; 实际上的空间是和 short int 一样。
typedef 声明 为一个已有的类型取一个新的名字 typedef type newname; 例如: typedef int feet; int 类型 用feet 这个名称可以表示了 int distance => feet distance;
6.C++ 中有两种类型的表达式:
左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
C++ 中,有两种简单的定义常量的方式:
使用 #define 预处理器。
使用 const 关键字。
7.存储类:
auto 存储类 auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
register 存储类 用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词), 没有内存位置,寄存器只用于需要快速访问的变量,
static 存储类 指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。 当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
extern 存储类 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。 通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:
mutable 说明符仅适用于类的对象,这将在本教程的最后进行讲解。它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。
thread_local 存储类 声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。
8.运算符:
算术运算符:+、-、*、/、%、++、--
关系运算符:==、!=、>\<、>=、<=
逻辑运算符:&&、||、!
位运算符:&、 | 、 ^、 ~、 << 、 >>
赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
杂项运算符: sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。
Condition ? X : Y 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。
, 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。
.(点)和 ->(箭头) 成员运算符用于引用类、结构和共用体的成员。
Cast 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。
& 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。
* 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。
9.C++ 数学运算,引用数学头文件 <cmath>。
1 double cos(double); 该函数返回弧度角(double 型)的余弦。
2 double sin(double); 该函数返回弧度角(double 型)的正弦。
3 double tan(double); 该函数返回弧度角(double 型)的正切。
4 double log(double); 该函数返回参数的自然对数。
5 double pow(double, double); 假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。
6 double hypot(double, double); 该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。
7 double sqrt(double); 该函数返回参数的平方根。
8 int abs(int); 该函数返回整数的绝对值。
9 double fabs(double); 该函数返回任意一个浮点数的绝对值。
10 double floor(double); 该函数返回一个小于或等于传入参数的最大整数。
10. 循环类型 :
while 循环 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
for 循环 多次执行一个语句序列,简化管理循环变量的代码。
do...while 循环 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
循环控制语句:
break 语句 终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。
continue 语句 引起循环跳过主体的剩余部分,立即重新开始测试条件。
goto 语句 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。
判断语句:
if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else 语句 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
switch 语句 一个 switch 语句允许测试一个变量等于多个值时的情况。
? : 运算符 可以用来替代 if...else 语句。它的一般形式如下: Exp1 ? Exp2 : Exp3;
Lambda表达式 主要分为五个部分:
[函数对象参数]、(操作符重载函数参数)、mutable 或 exception 声明、-> 返回值类型、{函数体}.
[] (int x, int y) -> int { int z = x + y; return z; }
详细讲解:https://www.cnblogs.com/kekec/p/10904802.html
11.数组:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";
1 strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
2 strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1); 返回字符串 s1 的长度。
4 strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。
5 strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
12. 指针例子:
#include <iostream>
using namespace std;
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << var << endl; // 输出实际变量 20
cout << ip << endl; // 输出在指针变量中存储的地址 0xbfc601ac
cout << *ip << endl; // 输出访问指针中地址的值 20
return 0;
}
引用例子:
#include <iostream>
using namespace std;
int main ()
{
int i; // 声明简单的变量
double d;
int& r = i; // 声明引用变量 //& 读作引用 "r 是一个初始化为 i 的整型引用"
double& s = d; //读作 "s 是一个初始化为 d 的 double 型引用"。
i = 5;
cout << i << endl; //5
cout << r << endl; //5
d = 11.7;
cout << d << endl; //11.7
cout << s << endl; //11.7
return 0;
}
13.时间:
1 time_t time(time_t *time); 该函数返回系统的当前日历时间,自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 .1。
2 char *ctime(const time_t *time); 该返回一个表示当地时间的字符串指针,字符串形式 day month year hours:minutes:seconds year\n\0。
3 struct tm *localtime(const time_t *time); 该函数返回一个指向表示本地时间的 tm 结构的指针。
4 clock_t clock(void); 该函数返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。如果时间不可用,则返回 .1。
5 char * asctime ( const struct tm * time ); 该函数返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息,返回形式为:day month date hours:minutes:seconds year\n\0。
6 struct tm *gmtime(const time_t *time); 该函数返回一个指向 time 的指针,time 为 tm 结构,用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
7 time_t mktime(struct tm *time); 该函数返回日历时间,相当于 time 所指向结构中存储的时间。
8 double difftime ( time_t time2, time_t time1 ); 该函数返回 time1 和 time2 之间相差的秒数。
9 size_t strftime(); 该函数可用于格式化日期和时间为指定的格式。
14.I/O 库头文件:
<iostream> 该文件定义了 cin 标准输入流、 cout 标准输出流、 cerr 非缓冲标准错误流 和 clog 缓冲标准错误流。
<iomanip> 该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。
数据流:
<ofstream> 该数据类型表示输出文件流,用于创建文件并向文件写入信息。
<ifstream> 该数据类型表示输入文件流,用于从文件读取信息。
<fstream> 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。
例如:ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
打开文件模式:
ios::app 追加模式。所有写入都追加到文件末尾。
ios::ate 文件打开后定位到文件末尾。
ios::in 打开文件用于读取。
ios::out 打开文件用于写入。
ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
15.C++ 中的运算符重载:https://www.runoob.com/cplusplus/cpp-overloading.html
基础:
数据封装是一种把数据和操作数据的函数捆绑在一起的机制。
数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。
栈:在函数内部声明的所有变量都将占用栈内存。
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
C++ 多线程: 是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。
基于进程的多任务处理是程序的并发执行。
基于线程的多任务处理是同一程序的片段的并发执行。
16.C++ 标准的异常:
std::exception 该异常是所有标准 C++ 异常的父类。
std::bad_alloc 该异常可以通过 new 抛出。
std::bad_cast 该异常可以通过 dynamic_cast 抛出。
std::bad_exception 这在处理 C++ 程序中无法预期的异常时非常有用。
std::bad_typeid 该异常可以通过 typeid 抛出。
std::logic_error 理论上可以通过读取代码来检测到的异常。
std::domain_error 当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument 当使用了无效的参数时,会抛出该异常。
std::length_error 当创建了太长的 std::string 时,会抛出该异常。
std::out_of_range 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。
std::runtime_error 理论上不可以通过读取代码来检测到的异常。
std::overflow_error 当发生数学上溢时,会抛出该异常。
std::range_error 当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error 当发生数学下溢时,会抛出该异常。
17.C++ 中的预定义宏
__LINE__ 这会在程序编译时包含当前行号。
__FILE__ 这会在程序编译时包含当前文件名。
__DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
__TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。
例如:
#include <iostream>
using namespace std;
int main ()
{
cout << __LINE__ << endl; // 6
cout << __FILE__ << endl; // test.cpp
cout << __DATE__ << endl; // Feb 28 2011
cout << __TIME__ << endl; // 18:52:48
return 0;
}