岗位需求和学习目标
============================================
1.岗位需求
嵌入式应用/软件开发工程师 --》C/C++
游戏后台服务器开发(脱离了嵌入式)
音视频开发(小众岗位),机器视觉
2.学习目标
熟练掌握C++常用的基本语法,利用C++编写一些简单的面向对象的程序
C++和C语言的联系和区别
============================================
1.联系
C++在C语言的基础上发展起来
C++融合了C语言全部的语法特性,在此基础上加入了面向对象编程语法规则
C++=C语言+面向对象语法
C++是C语言的超集(C++融合了C语言全部的语法特性)
面向对象的语法:类的封装,对象,多态,虚函数,纯虚函数和抽象类,模板和泛型编程,运算符重载,函数重载,命名空间,引用,STL标准模板库,智能指针....
2.区别
第一:C++采用面向对象的思想编程--》稍后学完类和对象再来体会解释这个含义
C语言面向过程的思想编程
面向过程:解决问题的思路--》先想清楚你这个问题的步骤
依据步骤封装函数/调用别人已经写好的函数
调用函数,一步步执行
第二:C头文件 #include <string.h>
头文件后缀名.h myhead.h
C++头文件 #include <cstring> //把.h去掉,前面加个c
头文件后缀名.hpp或者.h myhead.hpp或者myhead.h
第三:C源码 .c结尾
C++源码 .cpp结尾
第四:C编译器 gcc/arm-linux-gcc
gcc hello.c -o hello
./hello
C++编译器 g++/arm-linux-g++
g++ hello.cpp -o hello
./hello
安装g++ sudo apt-get install g++
注意:如果你写的C++代码,全部使用了C语言的语法特性,没有使用任何C++语法新特性,你用gcc/g++编译都是可以
如果你写的C++,哪怕只用到一点点C++新特性,必须用g++编译
C++的输入和输出
============================================
1.输出
C语言: printf
C++:cout<<输出的变量名 或者你继续使用printf也行(鄙视你)
比如:cout<<"hello c++"<<endl
cout<<a<<endl; //打印单个变量
cout<<a<<b<<c<<d<<endl; //同时打印多个变量
回车换行:C语言 \n
C++ endl或者\n
注意的问题:
cout打印指针的时候,如果是char *指针,cout默认把它当成字符串打印,不会当成指针/地址打印
如果char *你要打印地址,必须强制类型转换
2.g++比gcc更加严格
例子一:char *p="China"; // "China"是个字符串常量,常量不可以修改,所有指针必须用const修饰
C语言gcc编译器认为没有问题
C++编译器g++给出警告
const char *p="China";
例子二:void*转换成其他类型指针
C语言 int *p=malloc(4);
C++ int *p=(int *)malloc(4);
3.输入
C语言: scanf
C++:cin>>变量的名字
比如:int a;
float b;
cin>>a;
cin>>b;
cin>>a>>b; //同时获取多个变量,等价于scanf("%d%f",&a,&b)
注意的问题:
初学者总喜欢给变量取地址 cin>>&a;(初学者中了scanf的毒)
函数重载
============================================
1.概念
C语言没有这个语法特性
C++允许在同一个代码中定义多个相同名字的函数,但是要求函数的参数类型/参数个数不同
好处
实现了接口的统一(在你的程序中相似功能的函数都有一个共同的名字)
2.底层原理
g++会依据函数调用的时候传递的实参类型以及实参的个数,自动匹配对应版本的重载函数
3.需要注意的问题
第一个:函数名必须相同
第二个:参数的个数或者类型从左到右至少有一个是不同的
第三个:函数的返回值不作为重载的区分标准
命名空间(名称空间)
============================================
1.作用
跟C语言static类似,用来解决变量名字冲突的问题
2.语法规则
namespcace 命名空间的名字
{
各种变量;函数
}
3.使用命名空间
写法一:命名空间的名字yy::变量名n(函数)
比如: yy::n
#include <iostream>
using namespace std;
// 定义第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 定义第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
int main ()
{
// 调用第一个命名空间中的函数
first_space::func();
// 调用第二个命名空间中的函数
second_space::func();
return 0;
}
写法二:使用using声明命名空间
比如: using namespace yy;
后面要使用n,就只需要写名字即可
#include <iostream>
using namespace std;
// 定义第一个命名空间
namespace first_space
{
void func()
{
cout << "Inside first_space" << endl;
}
}
// 定义第二个命名空间
namespace second_space
{
void func()
{
cout << "Inside second_space" << endl;
}
}
using namespace first_space;//表示使用第一个命名
int main ()
{
// 调用第一个命名空间中的函数
func();
return 0;
}
4.重新认识std
using namespace std; //我要使用命名空间std
std: 在系统的头文件iostrteam中定义的一个命名空间
namespace std
{
cout;
cin;
endl;
}
C++中的动态内存分配(堆空间)
============================================
1.C语言动态内存分配
malloc() calloc() realloc()
free()
void *calloc(size_t nmemb, size_t size);
返回值:指向你申请的堆空间的首地址
参数:nmemb --》你打算申请多少块堆空间
size --》每一块堆空间的大小
比如: malloc(10*sizeof(int))
calloc(10,sizeof(int));
void *realloc(void *ptr, size_t size); //改变已经申请的堆空间的大小,重新分配新的堆空间
返回值:指向你重新分配的堆空间的首地址
参数:ptr --》原本已经申请的堆空间首地址
size --》新的堆空间大小
比如:最开始
int *p=malloc(10*sizeof(int))
我发现堆空间申请少了,不够用
realloc(p,400);
我发现堆空间申请多了,减少
realloc(p,8);
2.C++动态内存分配
新增两个关键字new和delete实现堆空间的申请和释放
写法一:
int *p=new int; //等价于int *p=malloc(sizeof(int));申请4个字节
*p=78;
delete p; //等价于free(p);
写法二:
int *p=new int[10]; //等价于int *p=malloc(10*sizeof(int));申请40个字节
p[0]=78; p[1]=96;
*p=78; *(p+1)=96;
delete []p;
写法三:
int *p=new int(10); //等价于int *p=malloc(sizeof(int));和 *p=10;
delete p;
总结:new申请的使用使用了[],那么delete释放的时候就要使用[]
C++中的引用
============================================
1.什么是引用
引用就是变量的别名
C语言中传递参数只有两种方式:传值 传地址(指针)
C++中传递参数只有三种方式:传值 传地址(指针) 传引用
2.语法规则
类型 &引用的名字=变量;
比如:
int a=99;
int &b=a; //定义int类型的引用b,b是a的引用(b是a的别名,b是指向a的引用)
引用该如何用??
引用指向的变量怎么用,引用就怎么用
比如:
float a=89.6;
float &b=a;
3.引用的好处/特点
第一:引用作为函数的形参,可以节约内存空间
引用不会占用额外的内存空间,引用的内存跟它指向的变量是同一个内存
第二:引用具备了传值和传地址的双重属性
第三:引用必须在定义的时候立马初始化(引用作为函数形参的时候例外)
4.经典面试问题
请问指针和引用有啥区别??
第一个:引用必须在定义的时候立马初始化
指针没有这个要求
第二个:指针是独立的变量,拥有独立的内存空间
引用依赖于指向的那个变量,跟那个变量是同一个东西(同一个东西有两个名字)
第三个:指针可以修改指向的地址
引用不可以修改指向新的变量
int a=89;
int b=54;
int &c=a;
c=b; //等价于a=b
练习
============================================
1.定义一个学生结构体
struct student
{
char name[20];
int age;
};
定义结构体变量,cout和cin配合,输入,输出学生信息
2.定义不同版本的重载函数
3.熟悉new和delete的用法(换成其他类型的指针)
熟悉calloc和realloc的用法
作业
============================================
1.重载三个版本的getarea()函数,分别求矩形,圆形,三角形的面积
2.查询cout输出,小数点位数设置
cout<<setprecision(2)<<a<<endl; //2表示小数点后面2位有效数字
如何打印八进制 十六进制
cout<<oct<<b<<endl; //八进制
cout<<hex<<b<<endl; //十六进制