C++的应用
============================================
1.岗位:嵌入式应用开发
纯粹的C++开发(windows,linux)
游戏引擎
C++和C语言之间的联系和区别
============================================
**1. 联系:C++全面兼容C语言的语法,但他又融入融了C++特有的语法(面向对象的思想)
区别一:
C语言面向过程的程序开发语言
面向过程:解决问题的时候按照问题的解决步骤一步步去实现
C++面对对象的程序开发语言
面向对象:把生活中所有的事物都抽象为一个个的对象,更加符合人类的思考方式,思考问题的方式就变成了我这个程序涉及到哪些对象.
区别二:
C语言头文件 C++头文件
#include <stdio.h> #include <cstdio> #include <cxxxxx> /加一个c就可以了
.h .h或者.hpp
C语言源文件 C++源文件
.c .cpp
编译 编译
gcc/arm-linux-gcc g++/arm-linux-g++
核心内容
1. C++的输入输出
2. C++的函数重载
3. C++的命名空间
4. C++中的动态内存分布
5. C++的字符串string
1. C++的输入输出
第一个C++程序,C++的输出
//#include <cstdio> //printf scanf 需要用到这个头文件
#include <iostream> //C++特有的头文件
/*
first.cpp:6:2: error: ‘cout’ was not declared in this scope
first.cpp:6:2: note: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: note: ‘std::cout’
*/
int main()
{
int m = 25;
float n = 56.98l;
char buf[10] = "摸鱼";
//printf("我正在学习C++!\n"); 活在C语言的世界
std::cout << "我正在学习C++\n";
std::cout << "我正在学习C++" << std::endl;
std::cout << m << std::endl;
std::cout << n << std::endl;
std::cout << buf << std::endl;
//一口气打印多个变量
std::cout << m << " " << n << " " << buf << std::endl;
return 0;
C++的输入
#include <iostream>
/*
scanf("%d",&m);
*/
int main()
{
int m;
std::cout << "请输入一个整数!" << std::endl;
//std::cin>>&m; 很典型的错误 //scanf("%d",&m);
std::cin >> m;
std::cout << "你刚才输入的值:" << m << std::endl;
}
cin和cout
#include <iostream>
#include <cstdio>
struct student
{
int age;
char name[10];
};
int main()
{
int m = 78;
float n = 56.23;
float *pp = &n;
int *p = &m;
//char *q="gec"; //不规范的写法
const char *q = "csdn"; //"gec"是个字符串常量,不能修改的
char buf[10] = "china"; //数组名就是首地址&buf[0]
struct student stu = {18, "zhangsan"};
std::cout << stu.age << std::endl;
std::cout << stu.name << std::endl;
std::cout << &m << std::endl; //C语言 %p
std::cout << *p << std::endl;
std::cout << p << std::endl;
std::cout << pp << std::endl;
std::cout << q << std::endl; //打印char *不能这样写
std::cout << buf << std::endl; //打印char *不能这样写
std::cout << (int *)q << std::endl;
std::cout << (int *)buf << std::endl;
printf("%p\n", q);
printf("%p\n", buf);
}
2. C++的函数重载 overload
定义:
C++允许在同一个程序中定义多个同名函数
实现了同一个函数名在逻辑上的统一,比如add函数就是加法,不论你怎么运算,都叫add
编译器会自动根据函数的参数类型或者个数去区分你究竟使用的是哪个版本的重载函数
比如:
int add1(int a,int b) //求两个整数的和
float add2(float a,float b)
int add3(int a,int b,int c)
C++可以通过统一函数名,实现多种不同的功能
函数重载的要求:
第一点:函数名必须相同
第二点:函数的参数类型或者参数个数不同
第三点:函数的返回值不作为函数重载区分的标准
函数重载例子:
#include <iostream>
#include <cstdio>
int add(int a, int b)
{
printf("第一个版本!\n");
return a + b;
}
int myadd(int a, int b) //不能算函数重载,原因是函数名不同
{
printf("第二个版本!\n");
return a + b;
}
/* int add(int m,int n) //不能算函数重载,原因是参数类型,个数跟第一个版本一模一样
{
printf("第三个版本!\n");
return m+n;
} */
float add(float a, float b)
{
printf("第四个版本!\n");
return a + b;
}
float add(int a, float b)
{
printf("第五个版本!\n");
return a + b;
}
int add(int a)
{
printf("第六个版本!\n");
return a + a;
}
int add(int a, int b, int c)
{
printf("第七个版本!\n");
return a + b + c;
}
/* void add(int a,int b,int c) //错误的,返回值类型不同不作为函数重载的区分标准
{
printf("第八个版本! %d\n",a+b+c);
} */
float add(float a, int b)
{
printf("第九个版本!\n");
return a + b;
}
int main()
{
int m = 9;
int n = 56;
float a = 45.3;
float b = 56.9;
printf("%d\n", add(m, n));
add(15, 12, 13);
}
函数重载的练习:
#include <iostream>
#include <cstdio>
int getArea(int a, int b)
{
return a * b;
}
float getArea(float a, float b)
{
return a * b;
}
float getArea(int r)
{
return 3.14 * r * r;
}
int main()
{
int m = 45;
int n = 56;
float a = 12.5;
printf("%d\n", getArea(m, n));
}
3.命名空间(名称空间)
作用:
防止同名变量冲突,方便程序员去区分不同的变量。跟C语言的static的作用类似
限制了某些变量或者函数的作用范围,实际上命名空间就是用了一对花括号把一群变量,
函数圈起来,限制了它们的作用范围
语法:
namespace 你自己取的名字
{
你需要定义在这个命名空间中的变量或者函数
}
使用:
命名空间的名字::它里面的变量或者函数
偷懒的写法: using namespace xxxx
后面代码中就可以不写命名空间的名字
特点:
第一个:命名空间可以嵌套其它的命名空间
第二个:定义匿名的命名空间
例子:
#include <iostream>
int a = 82;
int fun()
{
std::cout << "此函数执行!\n";
}
//自定义一个命名空间
namespace mm
{
int a = 56;
float b = 12.5;
int fun();
} // namespace mm
namespace tt
{
int a = 89;
float b = 23.96;
} // namespace tt
namespace hh
{
}
int main()
{
std::cout << a << std::endl; //82
int a = 123; //同名的局部变量
std::cout << a << std::endl; //123
std::cout << tt::a << std::endl;
std::cout << mm::a << std::endl;
{
//局部代码块
int a = 369; //作用域仅限于这个花括号里面
std::cout << a << std::endl; //369
}
std::cout << a << std::endl; //123
}
命名空间的嵌套
#include <iostream>
using namespace std; //声明我要使用命名空间std
//自定义一个命名空间
namespace mm
{
int a = 56;
float b = 12.5;
} // namespace mm
namespace tt
{
//第一种写法,嵌套使用了一个本来就存在的命名空间
using namespace mm;
char buf[10] = "hello";
} // namespace tt
namespace hh
{
//第二种写法,嵌套定义了一个新的命名空间
namespace yy
{
int m = 58;
float n = 15.96;
} // namespace yy
double c = 78.36;
} // namespace hh
int main()
{
cout << tt::a << endl;
cout << tt::b << endl;
cout << hh::yy::m << endl;
cout << hh::yy::n << endl;
}
匿名命名空间
#include <iostream>
//#include "other.hpp"
extern int fun();
using namespace std;
namespace //匿名命名空间(没有给它取名字)
{
int a = 15;
float b = 12.35;
} // namespace
int main()
{
cout << a << endl;
cout << b << endl;
fun();
}
4. 动态内存分配(给指针分配堆空间)
C语言:
分配堆空间 malloc calloc realloc
释放堆空间 free
C++:
分配堆空间 new
int *p=new int; 对应的释放 delete p;
int *p=new int[10]; 对应的释放 delete []p;
释放堆空间 delete
例子:
#include <iostream>
using namespace std;
int main()
{
int *p = new int;
float *q = new float;
//char *pp=new char; //仅仅只是分配了一个char大小的堆空间
//char *pp=new char[100]; //分配了100char大小的堆空间
//char *pp=new char(97);
int *pp = new int[10];
//int *pp=malloc(10*sizeof(int));
int *ppp = new int(452); //分配1个int大小的堆空间,顺便把这个堆空间赋值为10
//int *ppp=malloc(sizeof(int)) *ppp=452;
cout << *ppp << endl;
*p = 15;
cout << *p << endl;
//释放堆空间
delete p;
delete q;
delete[] pp;
}
5.C++的字符串string
1. string类
回顾C语言中存储字符串: char buf[10]; char *p=malloc(10);
strcat() sprintf()
C++多了一种选择: string str;
#include <iostream>
using namespace std;
/*
string存储字符串的好处
第一:不用考虑字符串的大小
第二:string提供了大量的函数供我们使用(查询api文档)
*/
int main()
{
string str;
//写法一:
str = "hellogec";
str.at(2) = 'u';
cout << str << endl;
//写法二
string str1("我是张三");
//写法三
string str2 = "我是青铜";
//写法四
string *str3 = new string("我是王者"); //重点注意
cout << str3 << endl; //打印的地址
cout << *str3 << endl; //打印的内容
cout << str << " " << str1 << " " << str2 << " " << *str3 << endl;
//字符串的拼接
string newstr = str + str1 + str2;
//寻找子串,截取字符串的一部分
cout << newstr << endl;
}