基于千锋教育超级C++课程及《算法笔记》为方便今后复习查阅所做笔记
仅供学习参考
第一章 环境搭建
1.1 QT Creator软件介绍
Qt Creator是跨平台的Qt IDE,轻量级集成开发环境(IDE)
此IDE能够跨平台运行,支持的系统包括Linux(32位及64位)、Mac OS X 以及Windows
设计目标是使开发人员能够使用Qt这个应用程序框架更加快速及轻易的完成开发任务
1.2 其他
Run in terminal在终端运行
中文
第二章 C++数据类型及语句
2.1 开始进入c++
2.1.1 Hello World
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
//include头文件包含 <>包含系统头文件 iostream标注的输入输出流
#include <iostream>
//使用命名空间std
using namespace std;
//C++工程中有且仅有一个main 它是程序的唯一人口
//main 左边的int描述的是函数的返回值类型
//main就是函数名(有且仅有一个)
//main右边()里面描述的是函数的形参(形参类型 形参名)
int main(int argc,char *argv[])
//{}复合语句 在当前表示的是main的函数体
{
cout << "Hello World!" << endl;//endl 是输出换行并刷新缓冲区
//cout输出设备(终端,屏幕)
//""双引号作用的是字符串
//;分号作为语句的结束
return 0;
//return将其后的表达式结果或数值 作为函数的返回值返回
//return结束当前函数
}
C语言小程序
#include<stdio.h>//头文件 //stdio.h标准输入输出库(stdio--standard input output) //.h 头文件的文件格式 //stdio.h 等价于cstdio int main(){ int a,b; scanf("%d%d",&a,&b); printf("%d",a+b); return 0; }//主函数 //主函数是一个程序的人口位置,整个程序从主函数开始执行 //一个程序最多只能有一个主函数
2.1.2 注释语句
注释语句不参与程序的编译,在程序的预处理阶段就被编译器删除
一般分为 行注释// 和 块注释/* */
行注释://表示仅能注释一行
块注释:/* */可以注释多行,注意不能嵌套
2.2 关键字
2.2.1 汇总
- asm
asm (指令字符串):允许在 C++ 程序中嵌入汇编代码。
- auto
auto(自动,automatic)是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
- bool
bool(布尔)类型,C++ 中的基本数据结构,其值可选为 true(真)或者 false(假)。C++ 中的 bool 类型可以和 int 混用,具体来说就是 0 代表 false,非 0 代表 true。bool 类型常用于条件判断和函数返回值。
- break
break(中断、跳出),用在switch语句或者循环语句中。程序遇到 break 后,即跳过该程序段,继续后面的语句执行。
- case
用于 switch 语句中,用于判断不同的条件类型。
- catch
catch 和 try 语句一起用于异常处理。
- char
char(字符,character)类型,C++ 中的基本数据结构,其值一般为 0~255 的 int。这 256 个字符对应着 256 个 ASCII 码。char 类型的数据需要用单引号 ’ 括起来。
- class
class(类)是 C++ 面向对象设计的基础。使用 class 关键字声明一个类。
- const
const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。在 C++ 中,用 const 声明一个变量,意味着该变量就是一个带类型的常量,可以代替 #define,且比 #define 多一个类型信息,且它执行内链接,可放在头文件中声明;但在 C 中,其声明则必须放在源文件(即 .C 文件)中,在 C 中 const 声明一个变量,除了不能改变其值外,它仍是一具变量。如:
const double pi(3.14159);
或
const double pi = 3.14159;
- const_cast用法:
const_cast<type_id> (expression)
该运算符用来修改类型的 const 或 volatile 属性。除了 const 或 volatile 修饰之外, type_id 和 expression 的类型是一样的。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
- continue
continue(继续)关键字用于循环结构。它使程序跳过代码段后部的部分,与 break 不同的是,continue 不是进入代码段后的部分执行,而是重新开始新的循环。因而它是"继续循环"之意,不是 break(跳出)。
- default
default(默认、缺省)用于 switch 语句。当 switch 所有的 case 都不满足时,将进入 default 执行。default 只能放在 switch 语句所有的 case 之后,并且是可选的。
- delete
delete(删除)释放程序动态申请的内存空间。delete 后面通常是一个指针或者数组 [],并且只能 delete 通过 new 关键字申请的指针,否则会发生段错误。
- do
do-while是一类循环结构。与while循环不同,do-while循环保证至少要进入循环体一次。
- double
double(双精度)类型,C++ 中的基本数据结构,以双精度形式存储一个浮点数。
- dynamic_cast
dynamic_cast(动态转换),允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构安全地转换类型。dynamic_cast 提供了两种转换方式,把基类指针转换成派生类指针,或者把指向基类的左值转换成派生类的引用。
- else
else 紧跟在 if 后面,用于对 if 不成立的情况的选择。
- enum
enum(枚举)类型,给出一系列固定的值,只能在这里面进行选择一个。
- explicit
explicit(显式的)的作用是"禁止单参数构造函数"被用于自动型别转换,其中比较典型的例子就是容器类型。在这种类型的构造函数中你可以将初始长度作为参数传递给构造函数。
- export
为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时,使用标准 C++ 新增加的关键字 export(导出)。
- extern
extern(外部的)声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。在 C++ 中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前仅支持 C 转换标记,来支持 C 编译器链接。使用这种情况有两种形式:
extern “C” 声明语句
extern “C” { 声明语句块 }
22. false
false(假的),C++ 的基本数据结构 bool 类型的值之一。等同于 int 的 0 值。
- float
float(浮点数),C++ 中的基本数据结构,精度小于 double。
- for
for 是 C++ 中的循环结构之一。
- friend
friend(友元)声明友元关系。友元可以访问与其有 friend 关系的类中的 private/protected 成员,通过友元直接访问类中的 private/protected 成员的主要目的是提高效率。友元包括友元函数和友元类。
- goto
goto(转到),用于无条件跳转到某一标号处开始执行。
- if
if(如果),C++ 中的条件语句之一,可以根据后面的 bool 类型的值选择进入一个分支执行。
- inline
inline(内联)函数的定义将在编译时在调用处展开。inline 函数一般由短小的语句组成,可以提高程序效率。
- int
int(整型,integer),C++ 中的基本数据结构,用于表示整数,精度小于 long。
- long
long(长整型,long integer),C++ 中的基本数据结构,用于表示长整数。
- mutable
mutable(易变的)是 C++ 中一个不常用的关键字。只能用于类的非静态和非常量数据成员。由于一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化。如果一个类的成员函数被声明为 const 类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。但是有些时候需要在该类函数中对类的数据成员进行赋值,这个时候就需要用到 mutable 关键字。
- namespace
namespace(命名空间)用于在逻辑上组织类,是一种比类大的结构。
- new
new(新建)用于新建一个对象。new 运算符总是返回一个指针。由 new 创建
- operator
operator(操作符)用于操作符重载。这是 C++ 中的一种特殊的函数。
- private
private(私有的),C++ 中的访问控制符。被标明为 private 的字段只能在本类以及友元中访问。
- protected
protected(受保护的),C++ 中的访问控制符。被标明为 protected 的字段只能在本类以及其继承类和友元中访问。
- public
public(公有的),C++ 中的访问控制符。被标明为 public 的字段可以在任何类
38.register
register(寄存器)声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对 32 位编译器不起作用,当 global optimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与 register 关键字有关的其它符号都对32位编译器有效。
- reinterpret_cast
用法:
reinpreter_cast (expression)
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
- return
return(返回)用于在函数中返回值。程序在执行到 return 语句后立即返回,return 后面的语句无法执行到。
- short
short(短整型,short integer),C++ 中的基本数据结构,用于表示整数,精度小于 int。
- signed
signed(有符号),表明该类型是有符号数,和 unsigned 相反。数字类型(整型和浮点型)都可以用 signed 修饰。但默认就是 signed,所以一般不会显式使用。
- sizeof
由于 C++ 每种类型的大小都是由编译器自行决定的,为了增加可移植性,可以用 sizeof 运算符获得该数据类型占用的字节数。
- static
static(静态的)静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为 0,使用时可改变其值。静态变量或静态函数,只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。因此也称为"文件作用域"。在 C++ 类的成员变量被声明为 static(称为静态成员变量),意味着它被该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private 类型的也不例外。
- static_cast
用法:
static_cast < type-id > ( expression )
该运算符把 expression 转换为 type-id 类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
① 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
② 用于基本数据类型之间的转换,如把 int 转换成 char,把 int 转换成 enum。这种转换的安全性也要开发人员来保证。
③ 把空指针转换成目标类型的空指针。
④ 把任何类型的表达式转换成void类?
注意 static_cast 不能转换掉 expression 的 const、volitale、或者 __unaligned 属性。
- struct
struct(结构)类型,类似于 class 关键字,与 C 语言兼容(class 关键字是不与 C 语言兼容的),可以实现面向对象程序设计。
- switch
switch(转换)类似于 if-else-if 语句,是一种多分枝语句。它提供了一种简洁的书写,并且能够生成效率更好的代码。但是,switch 后面的判断只能是int(char也可以,但char本质上也是一种int类型)。switch 语句最后的 default 分支是可选的。
- template
template(模板),C++ 中泛型机制的实现。
- this
this 返回调用者本身的指针。
- throw
throw(抛出)用于实现 C++ 的异常处理机制,可以通过 throw 关键字"抛出"一个异常。
- true
true(真的),C++ 的基本数据结构 bool 类型的值之一。等同于 int 的非 0 值。
- try
try(尝试)用于实现 C++ 的异常处理机制。可以在 try 中调用可能抛出异常的函数,然后在 try 后面的 catch 中捕获并进行处理。
- typedef
typedef(类型定义,type define),其格式为:
typedef 类型 定义名;
类型说明定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。
- typeid
指出指针或引用指向的对象的实际派生类型。
- typename
typename(类型名字)关键字告诉编译器把一个特殊的名字解释成一个类型。在下列情况下必须对一个 name 使用 typename 关键字:
1. 一个唯一的name(可以作为类型理解),它嵌套在另一个类型中的。
2. 依赖于一个模板参数,就是说:模板参数在某种程度上包含这个name。当模板参数使编译器在指认一个类型时产生了误解。
56. union
union(联合),类似于 enum。不同的是 enum 实质上是 int 类型的,而 union 可以用于所有类型,并且其占用空间是随着实际类型大小变化的。
- unsigned
unsigned(无符号),表明该类型是无符号数,和 signed 相反。
- using
表明使用 namespace。
- virtual
virtual(虚的),C++ 中用来实现多态机制。
- void
void(空的),可以作为函数返回值,表明不返回任何数据;可以作为参数,表明没有参数传入(C++中不是必须的);可以作为指针使用。
- volatile
volatile(不稳定的)限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下:
int volatile nVint;
这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。因此常用于像中断处理程序之类的异步进程进行内存单元访问。
- wchar_t
wchar_t 是宽字符类型,每个 wchar_t 类型占 2 个字节,16 位宽。汉字的表示就要用到 wchar_t。
2.2.2 数据类型相关
char、short、int、float、double、struct、union、enum、signed、unsigned、void
2.2.3 存储相关
register、static、const、auto、extern
2.2.4控制语句相关
if、else、break、continue、for、while、do、switch case、goto、default
2.3 基本数据结构
2.3.1 变量的定义
变量是在程序运行过程中其值可以改变的量,需要在定义后才能使用,并且变量可以在定义的时候就赋初值
变量名一般来说可以任意取,但应满足
- 不能是C语言标识符
- 变量名的第一个字符必须是字母或下划线,其他字符必须是字母、数字或下划线
- 区分大小写
2.3.2 变量的类型
整型、浮点型、字符型、布尔型(C++)
2.4 整型类型
题目要求 | 注意 | ||
---|---|---|---|
短整型(short) | 一般用不到 | ||
整型(int) | 32bit | 10^9以内、32位整数 | |
长整型(long long) | 64bit | 超过10^10、64位整数 | 赋大于2^31-1初值,后面要加LL |
2.4.1 变量和常量
常量:在程序运行过程中,其值不可以改变的量
- 整型
- 实型
- 字符型
- 字符串
2.4.2 整型常量
开头 | 输出 | 备注 | |
---|---|---|---|
二进制 | 0b | bitset | #include |
八进制 | 0 | oct | |
十六进制 | 0x | hex |
#include <iostream>
#include <bitset>//二进制输出需要包含头文件 才能使用bitset
using namespace std;
int main()
{
//cout默认以十进制输出
cout<<0b00001111<<endl;//15
cout<<01234<<endl;//668
cout<<0xab<<endl;//171
//cout需要使用bitset<位数>(数值)输出二进制,位数一般是8、16、32
//注意需要加头文件
cout<<bitset<8>(0b00001111)<<endl;//00001111
//cout需要使用oct输出八进制
cout<<oct<<01234<<endl;//1234
//cout需要使用hex输出十六进制
cout<<hex<<0xab<<endl;//ab
return 0;
}
2.4.3 整型变量的定义
变量在运行过程中,其值一般能修改
变量的定义形式:类型名 变量名;
变量名的命名规则:由字母、数值、下划线_组成,不能由数值开头,不可以是关键字,区分大小写
C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制
注意:
- 定义变量的时候 ,系统会为变量开辟空间,空间大小为该变量类型的大小
- 变量名代表空间的内容(对变量名的操作等价于对空间的操作)
- 如果定义短整型变量就是short data; //data占2字节
- 如果定义长整型变量就是long data; //data占4字节,32位平台
2.4.4 整型变量的初始化
变量的初始化:在变量定义的时候,给变量赋值
全局变量如果不初始化 内容为0
局部变量如果不初始化 内容为不确定/随机
变量一般建议初始化为0
#include <iostream>
using namespace std;
/*
int data;
data =10; 不是初始化,仅仅是给data赋值
int num =10; 这才是初始化
*/
int num; //全局变量 如果不初始化 内容为0
//{}复合语句中定义的变量 一般为普通局部变量
//局部变量如果不初始化 内容为不确定/随机
void test01()
{
int data;
cout<<"data="<<data<<endl; //data=4200539
cout<<"num="<<num<<endl; //num=0
}
2.4.5 整型变量的使用
变量的使用: 读(取值)、写(赋值)
void test02()
{
int num=0;
num =100;//写操作
int data=0;
data =num;//num读 data写
cout<<data<<endl;//读操作
data++;//data =data+1; data读写
}
变量的声明:对变量名以及类型 提前说明,不会为该变量开辟空间
场景:先使用变量,后定义变量,必须事先对该变量进行声明
//局部变量先使用后定义 extern是不可行的
void test03()
{
//先使用data,后定义 需要提前变量声明
//int data; 这是定义 而不是声明 error: redeclaration of 'int data'
//extern int data; extern 外部可用 一般针对全局变量
//先使用data
cout<<"data="<<data<<endl;//error: 'data' was not declared in this scope
//后定义
int data=0;
}
正确做法:全局变量 extern事先声明
//提前变量声明
extern int data;
void test03()
{
//先使用
cout<<"data="<<data<<endl;
}
//后定义
int data=0;
-
变量的定义:创建变量名 系统会为变量开辟空间
-
变量的声明:对变量的类型和名称事先说明,不会为变量创建空间
-
变量的使用:对已经存在的变量的读写操作
2.4.6 键盘给变量赋值
使用关键字 cin 给变量获取键输入,cin代表的输入设备
void test04()
{
int data=0;
cout<<"请输入int数据:";//不用换行 不用endl
//cin 会根据data的类型 自动判断输入
cin>>data; //输入3.14
cout<<"data="<<data<<endl; //输出3
}
//同时给多个变量获取键盘输入(每个变量的值 以空格隔开)
//cin 可以自动跳过空格以及回车
void test05()
{
int data=0;
int num=0;
cout<<"请输入两个int数据:";
cin>>num>>data;
cout<<"num="<<num<< ",data=" <<data<<endl;
}
2.4.7 键盘(案例)
键盘获取两个int数值 求最大值(案例)
void test06()
{
//定义两个变量
int num1=0;
int num2=0;
//获取键盘输入
cout<<"请输入两个int数值:";
cin>>num1>>num2;
//求最大值
if(num1>num2)
{
cout<<"最大值为"<<num1<<endl;
}
else
{
cout<<"最大值为"<<num2<<endl;
}
}
2.4.8 输入输出(补充)
C语言的stdio.h