前言
最近在准备考研复试,虽然学校说复试时可以使用python或者java进行编程,但是看了一些题目,还是觉得C or C++更为方便一些,同时也看到了王道推荐用C++(因为可以使用STL),因为有过C语言的基础和一些编程基础(我个人觉得写代码的规则基本都一样,打算着重看一下和我经常使用的python写法不同的地方)所以决定花个一两天的时间粗略的把C++看一下,把基础的东西和STL学一下,对付一下复试。
开始学习
C++简介(内容来自百度)
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:封装、抽象、继承、多态,标准的 C++ 由三个重要部分组成:
- 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等
- C++ 标准库,提供了大量的函数,用于操作文件、字符串等
- 标准模板库(STL),提供了大量的方法,用于操作数据结构等(我需要重点注意的地方)
C++基本语法
- 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。
- 类 -类可以定义为描述对象行为/状态的模板/蓝图。
- 方法 -从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。
- 即时变量 -每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。
总的来说,以上的内容和C语言、C#有点像,C++更像是处于C和C#之间的一种语言。
C++程序结构
#include <iostream>
using namespace std;
// main() 是程序开始执行的地方
int main()
{
cout << "Hello World"; // 输出 Hello World
return 0;
}
注:
- 注意**using namespace std;**这个地方,这里是告诉编译器使用std命名空间,命名空间是C++中的一个相对新的概念。
- 写C++和写C格式差不多,以";“结束一条语句,可以多条语句在一行,但是必须以”;"隔开,这和python不一样
- 以{…}为代码块区域
C++数据类型
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
其中,wchar_t:
typedef short int wchar_t;
所以 wchar_t 实际上的空间是和 short int 一样。
一些基本类型可以使用一个或多个类型修饰符进行修饰:
- signed
- unsigned
- short
- long
typedef声明
可以使用typedef为一个已有的类型取一个新的名字,例如:
typedef type newname; //用法
typedef int xxi; //给int取个新名字为xxi
xxi n;//创建整型变量n
枚举类型(我没有用过这个东西,这里的内容就直接复制百度)
枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
创建枚举,需要使用关键字 enum。枚举类型的一般形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
…
标识符[=整型常数]
} 枚举变量;
如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始。
例如,下面的代码定义了一个颜色枚举,变量 c 的类型为 color。最后,c 被赋值为 “blue”。
enum color { red, green, blue } c;
c = blue;
默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。
enum color { red, green=5, blue };
在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1,但 red 的值依然为 0。
定义常量
在 C++ 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
杂项运算符
运算符 | 描述 |
---|---|
sizeof | sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。 |
Condition ? X : Y | 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。 |
, | 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。 |
.(点)和 ->(箭头) | 成员运算符用于引用类、结构和共用体的成员。 |
Cast | 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。 |
& | 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。 |
* | 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。 |
匿名函数
lambda函数在我平时使用中有用到,但是都是照葫芦画瓢,为了能用而用,所以到底是个什么并没有去了解过,发现c++里也有这个,按照我的理解,lambda可以利用以个表达式来表示一个函数,可以解决简单函数的函数名冲突,匿名函数也是一个函数对象,也可以把匿名函数赋值给以个变量,再利用变量来调用该函数。
Lambda 表达式具体形式如下:
capture->return-type{body}
例如:
[](int x, int y){ return x < y ; }
如果没有返回值可以表示为:
capture{body}
例如:
[]{ ++global_x; }
在一个更为复杂的例子中,返回类型可以被明确的指定如下:
[](int x, int y) -> int { int z = x + y; return z + x; }
在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
另外一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接用this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:
** this { this->someFunc();> }();**
字符串
函数 | 目的 |
---|---|
strcpy(s1, s2) | 复制字符串 s2 到字符串 s1 |
strcat(s1, s2) | 连接字符串 s2 到字符串 s1 的末尾 |
strlen(s1) | 返回字符串 s1 的长度 |
strcmp(s1, s2) | 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0 |
strchr(s1, ch) | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置 |
strstr(s1, s2) | 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置 |
C++数据结构
struct type_name{
menber_type1 menber1;
menber_type2 menber2;
…}object_names;
type_name 是结构体类型的名称,member_type1 member1 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在结构定义的末尾,最后一个分号之前,可以指定一个或多个结构变量,这是可选的。
指向结构的指针
可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
struct Books *struct_pointer;
可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,把 & 运算符放在结构名称的前面,如下所示:
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,必须使用 -> 运算符,如下所示:
struct_pointer->title;