1. 安装
g++编译器
是编译C++代码使用的编译器,不要使用gcc了。
在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令
cd 文件夹
sudo dpkg -i *.deb 本地安装
sudo apt-get install g++ 在线安装
2. C++的语言特点及优势
c with class(类)
c plus plus
大型的软件项目,要使用面向对象的思想编程。但是C语言的语法是面向过程的。
现有面向对象的思想,后有面向对象的语言。
C++实现了面向对象程序设计;
在高级语言当中,处理运行速度是最快的。
C++语言非常灵活,功能非常强大。如果说C语言的优点是指针,那么C++的优点就是性能和类层次结构的设计。
C++非常严谨、精确和数理化,标准定义很细致。
C++语言的语法思路层次分明、相呼应;语法结构是显式的、明确的。
3 .简介
1 C++的含义
c with class
c plus plus 简称c++
2 文件后缀
.cpp
3 编译命令
g++ test.cpp -o test
4 C++的标准库头文件没有.h
5 C++兼容C语言中的头文件
stdio.h在c++中也能使用,c++建议把stdio.h写成
stdio.h --- cstdio
stdlib.h --- cstdlib
string.h --- cstring
4. c++与c区别:
例如五子棋游戏:
面向过程的设计思路:
① 开始游戏
② 黑子先走
③ 绘制画面
④ 判断输赢
⑤ 轮到白子
⑥ 绘制画面
⑦ 判断输赢
⑧ 返回步骤2
⑨ 输出最后结果
面向对象的设计思路:整个五子棋可以分为 :
① 玩家系统,黑白双方,这两方的行为是一模一样的
② 棋盘系统,负责绘制画面
③ 规则系统,负责判定诸如犯规、输赢等。
第一类对象(玩家对象)负责接受用户输入,
并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,
同时利用第三类对象(规则系统)来对棋局进行判定。
总结:
1) 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,
使用的时候一个一个依次调用就可以了。
2) 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,
而是为了描叙某个事物在整个解决问题的步骤中的行为 。
二、标准输入输出
1. 第一个c++程序
输出:hello world
示例1:
#include <iostream> //io输入输出 stream流 //std::cout 输出流对象 对象在面向对象语言中指的是类的一个实例,就是用类定义的变量。 //std::是cout的命名空间 // << 运算符重载,后面会学的语法。 在这里是将<<的右值给左值,在这里是使用输出流对象输出字符串。 // << 继续给cout输出 std::endl; 换行符 end line //C++的main返回值必须是int int main() { std::cout<<" hello world !"<<std::endl; return 0; }
编译:g++ test.cpp -o test
运行:./test
2. 输出流对象
输出流对象可以自动识别基本类型的输出类型
std::cout
对象?
示例2:
#include <iostream> int main() { int a = 10; char c = 'q'; std::cout<<a<<" "<<c<<std::endl;//10 q 自动识别要输出变量的类型 return 0; }
练习1:
使用for循环输出10个整数 0~9
改进优化:
在C++中for循环的表达式1可以定义变量,变量的作用域是表达式1、
表达式2、表达式3和循环体,生命周期是整个for循环的过程
# include <iostream> int main() { //如果for循环结束后还想要使用i,那么i就不能定义在表达式1里面 for(int i = 0;i < 10;i++) { std::cout<<i<<" "; } std::cout<<std::endl; return 0; }
3. 输入流对象
输入流对象可以自动识别基本类型的数据类型
std::cin
示例3:
#include <iostream> int main() { int age; std::cout<<"please input age:"<<std::endl; std::cin>>age;//从输入流获得一个整数存放到age变量中,cin会根据变量类型自动识别要输入的数据类型。 std::cout<<age<<std::endl; //<< >>都指向了数据流的方向 }
练习2:
输入一个字符 如果是大写 则转为小写 如果是小写则转为大写
#include <iostream> int main() { while(1) { char c; std::cin>>c; if(c>='A' && c<='Z') { c+=32; } else if(c>='a' && c<='z') { c-=32; } std::cout<<c<<std::endl; } return 0; }
4. cin同时获取多个值
示例4:
#include<iostream> int main() { std::cout<<"请输入一个age"<<std::endl; int age; char f; std::cin>>age>>f;//age的数据需要先输入 std::cout<<"my age is"<<age<<" "<<f<<std::endl; return 0; }
std::cout
std::cin
都是C++给我们定义好的对象。
三、命名空间
1.使用命名空间的目的
避免同名冲突, 学名:避免命名空间污染
注意:C++语言只有一个命名空间std,C++定义的所有的类和对象都是std这个命名空间下的命名的
C++的标准库都是在std命名空间中定义的
2.命名空间的表示方法
(1)方法1
最常见的用法
使用时 加上 using namespace std;就可以
示例5:
#include <iostream> using namespace std;//声明下面的代码都使用std命名空间 int main() { char c; cin>>c;//前面不用加std:: if(c>='a'&&c<='z') { c -= 32; } else if(c>='A'&&c<='Z') { c += 32; } cout<<c<<endl; }
C++只给我们提供了一个命名空间std。
练习3:
使用命名空间的方式,输入年龄age,输出:“my age is "age;
#include <iostream> using namespace std; int main() { int age; cin>>age; cout<<"my age is "<<age<<endl; return 0; }
(2)方法2
最不常见的用法
示例6:
#include<iostream> //把使用到的内容单独进行声明 using std::cout; using std::cin; using std::endl; int main() { cout<<"hello world!"<<"my god"; cout<<"come on baby!"<<endl; char name[20]; cout<<"please input name:"; cin>>name; cout<<"name:"<<name<<endl; return 0; }
(3)方法3
示例7:
迫于无奈
当两个命名空间中有相同的标识符时,在使用这个标识符的时候必须把命名空间写在前面!
假设有一个叫mystd的命名空间里也有一个cout
std::cout
mystd::cout
#include<iostream>
using namespace std;
using namespace mystd;
int main()
{
std::cout<<“hello world!”<<“my god”;
std::cout<<“come on baby!”<<std::endl;
char name[20];
std::cout<<“please input name:”;
cin>>name;
std::cout<<“name:”<<name<<std::endl;
return 0;
}
3.自己写命名空间
示例8:
自定义命名空间teacher
#include<iostream>
using namespace std;
//namespace定义命名空间的关键字,teacher是定义的命名空间的名字
namespace teacher
{
//在命名空间里定义
char name[20] = “小明”;
//命名空间内部可以定义任何内容
}
//using namespace teacher;
int main()
{
//因为name是定义在teacher命名空间里,所以要么先声明使用teacher命名空间,要么在name前面加上teacher::
cout<<teacher::name<<endl;
return 0;
}
示例9:
定义命名空间teacher和worker
#include<iostream>
using namespace std;
//定义命名空间teacher
namespace teacher
{
char name[20] = “大神”;
int age = 15;
}
//定义命名空间worker
namespace worker
{
char name[20] = “大爷”;
int wight = 180;
}
//两个命名空间都有name
using namespace teacher;
using namespace worker;
int main()
{
cout<<teacher::name<<endl; //因为teacher和worker都有name,所以这里必须写命名空间
cout<<age<<endl; //因为只有teacher里有age,所以这里使用的是teacher里的age
}
如果想深造推荐书 C++primer第五版,不要通篇的读,要当做字典看。
注意不是C++ primer plus
练习4:
分别在teacher和worker命名空间中添加函数showName()来输出name
main中,调用两个函数showName();
#include <iostream>
using namespace std;
namespace teacher
{
char name[] = “大神”;
int age = 18;
void showName()
{
cout<<name<<endl;//优先选择同一个命名空间的成员
}
}
namespace worker
{
char name[] = “大爷”;
int wight = 180;
void showName()
{
cout<<name<<endl;
}
}
using namespace teacher;
using namespace worker;
int main()
{
teacher::showName();
worker::showName();
return 0;
}
思考:两个命名空间里的成员是不是全局变量?是全局变量!
4.匿名命名空间
示例10:
当定义全局变量,不指定命名空间时,C++会默认将全局变量放在匿名命名空间中
#include <iostream>
using namespace std;
int a = 10;//没有指定命名空间的全局变量
int main()
{
int a = 20;//定义局部变量a
cout<<::a<<endl;//::a是使用匿名命名空间的全局变量a
return 0;
}
:: 域
命名空间的作用只在起名上
自定义名字空间:
(1)名字空间::name
(2)内部优先
(3)全局变量,会默认放在匿名命名空间中
四、bool类型
bool是基本数据类型(内置类型,不需要声明就能使用的类型),用来表示逻辑真假。
C++依然可以使用0和非0表示真假,C++增加bool类型专门表示真假true false
真假: 非0为真(true) 0是假(false)
bool类型能够增强程序可读性
int empty();
bool empty();
示例11:
#include<iostream>
using namespace std;
int main()
{
bool b1;
b1 = 10;
//正常情况下输出bool类型的值就是0 1
cout<<b1<<endl;
bool b2;
b2 = -23;
cout<<b2<<endl;
bool b5;
b5 = 0;
cout<<b5<<endl;
bool b3;
b3 = true;
cout<<b3<<endl;
bool b4;
b4 = false;
cout<<b4<<endl;
cout<<sizeof(b4)<<endl; //1字节
//bool 类型有多大?
//A 1字节
//B 2字节
//C 至多1字节
}
示例12:
#include<iostream>
using namespace std;
int main()
{
bool gender = true;
bool sex = false;
cout<<(gender?"帅哥":"美女")<<endl;
cout<<(sex?"帅哥":"美女")<<endl;
cout<<"gender"<<boolalpha<<gender<<endl;//boolalpha输出true和false,需要在除数bool变量之前加 输出 true
cout<<"sex:"<<sex<<endl; //false
bool c = true;
cout << "c = " <<noboolalpha<< c << endl;//noboolalpha取消true和false的输出 输出1
}
五、字符串处理
1.c++字符串有两种处理方法
1) c风格 用字符数组存储 用字符指针操作 char s[100]="mygod"; char *p = “hello”;
C语言字符串的两个要素:1. '\0'结尾 2. 字符串首地址
2) c++ 标准库中string类
2. string类的操作
(1)需要加头文件#include<string>
注意:string是C++的头文件,不是C语言的头文件,和string.h不是一回事, 推荐写成<cstring>
(2)需要加std命名空间 using namespace std;
(3)赋值 连接 拷贝。。。
示例13:
创建string对象
#include <iostream> #include <string>
using namespace std;
int main()
{
//string是类类型 class type
string s1 = “hello world”;//创建string对象s1,存放字符串"hello world"
string s2(“hello farsight”);
string s3(s2);//使用s2创建s3,使用s2拷贝s3
string s4 = s3;//使用s3拷贝s4
cout<<s1<<endl;//hello world
cout<<s2<<endl;//hello farsight
cout<<s3<<endl;//hello farsight
cout<<s4<<endl;//hello farsight
}
void fun(char* s)
{
}
void fun2(string s)
{
}
示例14:
转换
(1)c风格转为c++风格
string s = "abvc";
(2) 将string转换成C风格字符串
c_str() 将string转成char*
C++推荐我们使用string字符串,但是有些时候api的参数需要我们使用C风格字符串char* 类型的参数,这时候需要我们将string转换成C风格字符串。
#include <iostream> #include <string> #include <cstdio>//声明sprintf
using namespace std;
int main()
{
string s1 = “hello world”;
char buf[100];
//格式化字符串%s只要char* 参数
sprintf(buf,“s1 = %s”,s1.c_str());//将s1转换成 char*类型
cout<<buf<<endl;
}
示例15:
赋值
string对象赋值可以通过赋值符号 =,直接将值赋予给目标对象
#include <iostream> #include <string>
using namespace std;
int main()
{
string s = “hello world”;
string s2 = “hello farsight”;
s2 = s;//将s中存放的字符串放到s2里面,此时s2里也是hello world
cout<<s2<<endl;
}
示例16:
拼接
string可以通过”+ +=”来与string对象进行拼接,
注意: string只能拼接string,如果需要拼接其他类型,只能使用sprintf()进行复杂的字符串格式化
#include <iostream> #include <string>
using namespace std;
int main()
{
string s1 = “hello”;
string s2 = " world";
s1 += s2;
cout<<s1<<endl;
//s1 += 1;//?不可以 string只能和string做加法
//如果就是想把整数加到string中,在C++string类中没有好办法,还得使用sprintf
char buf[100];
sprintf(buf,"%s %d",s1.c_str(),1);
cout<<buf<<endl;//hello1
}
示例17:
比较 == != < > <= >= 真假 true false
字符串比较比的是什么?比较的是第一个不相等字符的ascii码值。
#include <iostream> #include <string>
using namespace std;
int main()
{
string s1 = “hello world”;
string s2 = “hello world”;
cout<<(s1==s2)<<endl; //1
string s3 = “hello farsight”;
cout<<(s3!=s1)<<endl; //1
cout<<(s1>s3)<<endl; //1
if(s1 == s2)
{
cout<<“=”<<endl;
}
else
{
cout<<“!=”<<endl;
}
}
示例18:
string类型的成员函数
empty() 和 size()
empty()判断空,如果字符串是空返回true
size()返回字符串长度,算法和strlen是一样的。
#include <iostream> #include <string> #include <cstdio>
using namespace std;
int main()
{
string s = " ";
cout<<s.empty()<<endl;//0
string s2 = “”;
cout<<s2.empty()<<endl;//1
string s3 = “hello world”;
cout<<s3.size()<<endl;//11
cout<<sizeof(s3)<<endl;//4 和字符串有多长无关 string类型中只有一个成员变量char*
}
示例19:
获取字符对象
C++可以通过字符串对象[下标]来直接获取该位置的字符。
#include <iostream> #include <string>
using namespace std;
int main()
{
string s = “hello world”;
for(int i = 0;i < s.size();i++)
{
cout<<s[i];//s[i]获得s中i元素的字符,s[0]是h
}
cout<<endl;//只输出一个换行
s[0] = ‘w’;//将s对象0元素的h赋值成w
cout<<s<<endl;//wello world
}
示例20:
cin输入字符串
cin无法输入空格 如果输入有空格 只拿到空格之前的
#include <iostream> #include <string>
using namespace std;
int main()
{
string s;
cin>>s;//将输入的字符串存放到对象s中
cout<<s<<endl;
}
示例21:
getline输入字符串 遇到'\n'结束输入
getline()不是string的成员函数
读入一行的字符串,包括空格。
#include <iostream> #include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);//参数1 cin是输入流对象获得字符串,如果将cin换成其他的流对象,就可以从其他地方读取字符串,参数2 是读取字符串后存放的地方
cout<<s<<endl;
}
练习5:
输入一个字符串,将其中的大写字母转换为小写字母
输入一个字符串到string对象中,然后把string对象中的大写字母转成小写字母。
#include <iostream> #include <string> using namespace std;
int main()
{
string s;
cin>>s;
for(int i = 0;i < s.size();i++)
{
if(s[i]>=‘A’ && s[i]<=‘Z’)
s[i]+=32;
}
cout<<s<<endl;
return 0;
}
作业:
盲打所有示例和练习
编程1.
随机点名 定义名字数组string names[]={"rose","jack","tom"};
随机抽取一个数组中的人员
头文件:#include<cstdlib>
#include<ctime>
方法:srand(time(0));初始化随机种子
rand()%5;生成随机数
编程2.
-
定义结构体Student 结构体成员:string name
string num
编写函数实现:N个学生信息 宏定义N
-
inputStudentInfo(Student* s)函数,需要将每个学生信息(姓名 学号)输入计算机保存 cin
参数指向学生数组
3.find_stu(Student* s, string serchName)函数,键盘输入某个学生的姓名 如果该学生存在 则输出其基本信息,
如果不存在,则输出"not found"
C++基础教程
一、数据类型
1.1、第一个C++程序
1.2、数据类型
1.3、常量及符号
-
1、整型常量:整型常量可以分为有符号整型常量和无符号整型常量
-
八进制:以0开头,即以0作为八进制数的前缀,每位取值范围是0~7,八进制数通常是无符号数。
- 例如:016、0101、0128都是合法的八进制数
-
十六进制:以0x或者0X开头,其数码取值范围0 ~ 9,以及A ~ F或者a ~ f
- 例如:
0X2A1、0XC5、0XFFFF
都是合法的16进制数
- 例如:
-
-
2、实型常量
- 小数表示法:由整数部分和小数部分组成,整数部分和小数部分每位取值范围是0~9,例如:
0.0、3.25、0.00596、2.0
- 指数表示法:指数部分以符号"e"或者"E"开始,但必须是整数,并且符号"e"或"E"两边都必须有一个数,例如:
1.2e20
和-3.4e-2
- 小数表示法:由整数部分和小数部分组成,整数部分和小数部分每位取值范围是0~9,例如:
-
3、字符常量:字符常量是单引号括起来的字符,例如:
'a'和'?'
都是合法字符常量。字符'a'的ASCII码值是97
,字符'A'的ASCII码值是41
,字符'?'的ASCII码值是63
转义字符是特殊的字符常量,使用时以字符串’'代表开始转义,和后面不同的字符表示转义的字符。转义字符表如下所示:
-
4、字符串常量:是由一对双引号括起来的零个或多个字符序列,例如:“welcome to our school”、“hello world”。""可以表示一个空字符串。
- 字符常量’A’和字符串常量"A"是不同的,
字符串常量"A"是由'A'和'\0'两个字符组成的
,字符串长度是2,字符串常量'A'只是一个字符
,没有长度。
- 字符常量’A’和字符串常量"A"是不同的,
-
5、其他常量
- 布尔常量:布尔常量只有两个,一个是true,表示真;另一个是false,表示假。
- 枚举常量:枚举型数据中定义的成员也是常量,这将在后文介绍。
- 宏定义常量:通过#define宏定义的一些值也是常量。例如:define PI3.1415。其中PI就是常量。
1.4、变量
- 1、标识符:是用来对C++程序中的常量、变量、语句标号以及用户自定义函数的名称进行标识的符号。
- 标识符命名规则:
- 1.有字母、数字及下划线组成,且不能以数字开头。
- 2.大写和小写字母代表不同意义。
- 3.不能与关键字同名
- 4.尽量“见名知义”,应该受一定规则的约束。
- 不合法的标识符:6A、ABC*、case(保留字)
- 标识符命名规则:
c++保留关键字,如表所示:
-
2、变量与变量说明:变量使用前一定要定义或说明,变量声明的一般形式如下:
[修饰符] 类型 变量名标识符
;- 类型是变量类型的说明符,说明变量的数据类型。修改师傅是任选的,可以没有。
- 类型是变量类型的说明符,说明变量的数据类型。修改师傅是任选的,可以没有。
-
3、整型变量:整型变量可以分为短整型、整型和长整型,变量类型说明符分别是short、int、long。根据是否有符号还可分为以下6种。
- 整型 [signed] int
- 无符号整型 unsigned [int]
- 有符号短整型 [signed] short [int]
- 无符号短整型 unsigned short [int]
- 有符号长整型 [signed] long [int]
- 无符号长整型 unsigned long [int]
-
4、实型变量:又称为浮点型变量,变量可分为单精度(float)、双精度(double)和长双精度(long double)三种。
-
5、变量赋值:变量值是动态改变的,每次改变都需要进行赋值运算。变量赋值的形式如下:
变量名标识符 = 表达式
,例如:
-
6、变量赋初值:可以在声明变量的时候就把数据赋给变量,这个过程叫变量赋初值,赋初值的情况有以下几种:
int x=5;
:表示定义x为有符号的基本整型变量,赋初值为5int x,y,z=6;
:表示定义x、y、z为有符号的基本整型变量,z赋初值为6int x=3,y=3,z=3;
:表示定义x、y、z为有符号的基本整型变量,且赋予的初值均为3
-
7、字符变量:
- 1、一个字符类型,即可以字符形式输出,也可以整数类型输出:
- 2、允许对字符数据进行算术运算,此时就是对它们的ASCII码值进行算术运算:
- 1、一个字符类型,即可以字符形式输出,也可以整数类型输出:
1.5、数据输入与输出
- 1、控制台屏幕
- 2、操作控制:在头文件iomanip.h中定义了一些控制流输出格式的函数,默认情况下整型数按十进制形式输出,也可以通过hex将其设置为十六进制输出。流操作的控制具体函数如下
二、表达式与语句
2.1、运算符
- 1.算术运算符:算术运算主要指常用的加(+)、减(-)、乘(*)、除(/)四则运算,算术运算符中有单目运算符和双目运算符。
- 2.关系运算符:关系运算符主要是对两个对象进行比较,运算结果是逻辑常量真或假。
- 3、逻辑运算符:逻辑运算符是对真和假这两种逻辑值进行运算,运算后的结果仍是一个逻辑值
- 4、赋值运算符
- 5、位运算符
- 6、移位运算符
- 7、sizeof运算符
- 8、条件运算符
- 9、逗号运算符
2.2、优先级和结合性
- 1、优先级
- 2、结合性
2.3、表达式
- 1.算数表达式
- 2.关系表达式
- 3.条件表达式
- 4.赋值表达式
- 5.逻辑表达式
- 6.逗号表达式
2.4、类型转换
三、条件判断语句
3.1、决策分支
3.2、判断语句
3.3、使用条件运算符进行判断
3.4、switch语句
3.5、判断语句的嵌套
四、循环语句
4.1、while循环
4.2、do…while循环
4.3、while与do…while比较
4.4、for循环
4.5、循环控制
4.6、循环嵌套
4.7、循环应用实例
五、函数
5.1、函数参数以及返回值
5.2、函数调用
5.3、变量作用域
5.4、重载函数
5.5、内联函数
5.6、变量的存储类别
六、指针和引用
6.1、一维数组
6.2、二维数组
6.3、字符数组
6.4、指针
6.5、指针与数组
6.6、指向函数的指针
6.7、引用
6.8、指针数组
七、构造数据类型
7.1、结构体
7.2、结构体与函数
7.3、结构体数组
7.4、共用体
7.5、枚举类型
7.6、自定义数据类型
八、面向对象编程
8.1、面向对象概述
8.2、面向对象与面向过程
8.3、统一建模语言
九、类和对象
9.1、C++类
9.2、构造函数
9.3、析构函数
9.4、类成员
9.5、友元
9.6、命名空间
十、继承与派生
10.1、继承
10.2、重载运算符
10.3、多重继承
10.4、多态
10.5、抽象类
十一、模板
11.1、函数模板
11.2、类模板
11.3、模板的使用
11.4、链表类模板
十二、STL标准模板库
12.1、序列容器
12.2、结合容器
12.3、算法
12.4、迭代器
十三、RTTI与异常处理
13.1、RTTI(运行时类型识别)
13.2、异常处理
十四、文件操作
14.1、文件流
14.2、文件打开
14.3、文件的读写
14.4、文件指针移动操作
14.5、文件和流的关联和分离
14.6、删除文件
十五、网络通信
15.1、TCP/IP协议
15.2、套接字
15.3、简单协议通讯