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"