面向对象第二讲
1.C与C++
C语言是面向结构,C++是面向对象。
C语言能快速地解决具体事物,但在后期的维护和扩展方面非常麻烦。
C++能够解决复杂业务逻辑,彼此之间相互独立,在后期维护扩展中可以直接添加修改。
面向结构能够快速解决具体任务,但从长期的角度来看,任务越复杂,面向结构的难度越大,在添加新的过程时,一般情况下,面向结构需要大范围地修改代码;在维护时,由于面向结构是将整个问题分割成若干的问题去解决的,所以不能准确定位代码,也因此不能随便服用之前写好的代码。
面向对象则能完美解决这些问题。虽然在前期会耗费更多的时间,但由于代码与代码之间相互独立,增加功能时所需要的仅仅是添入新的一段代码就可以解决;维护也不需要大动干戈;而正因为代码之间的相互独立,代码与代码可以不断复用,后期可以省下很多资源和时间。
面向对象特点:
应用对象:
面向对象:解决复杂宏观的系统任务
面向结构:解决具体任务
2.命名冲突
命名冲突产生的场景:多人协同开发
命名冲突原因:全局变量、函数
①.static关键字
C语言如何解决多个文件导致的命名冲突?
答:static关键字
static关键字作用:
Ⅰ.修饰局部变量:延长局部变量的生命周期(程序执行结束之后再释放)
void fun()
{
int num = 5;
num++;
printf("num = %d\n",num);
}
int main()
{
func();
func();
func();
return 0;
}
程序运行结果:
num = 6
num = 6
num = 6
第一次函数执行完之后,num被释放,第二次、第三次执行的时候num还是5。
void fun()
{
static int num = 5;//在执行完之后num不释放,将它的生命周期延长至整个程序结束,这句话只执行一次
num++;
printf("num = %d\n",num);
}
int main()
{
func();
func();
func();
return 0;
}
程序运行结果
num = 6
num = 7
num = 8
Ⅱ.修饰全局变量:被修饰的全局变量,只能在本文件内访问,不能在其他文件访问
extern int count;//extern:外部声明(声名该变量在其他文件中定义)
static int count = 5;//只能在本文件内访问
即使使用extern,也不能访问到其他文件中的count。
Ⅲ.修饰函数:被修饰的函数,只能在本文件内访问,不能在其他文件访问(原理同上)
②.命名空间
C++如何解决命名冲突?
答:命名空间
在每个文件中加命名空间,将每个文件独立开。
本质:给每个变量和函数添加static
namespace A
{
int count = 5;
}
int main()
{
printf(" count = %d",A::count);//::表示限定作用域,通过它来访问命名空间中的内容
}
namespace B
{
int count = 6;
}
int main()
{
printf(" count = %d",B::count);//::表示限定作用域,通过它来访问命名空间中的内容
}
程序运行结果
count = 5
count = 6;
命名空间中也可以放函数等,即能隔离所有东西。同时,命名空间内的所有内容只能在本文件访问。
注:源文件不能访问其他源文件的命名空间。命名空间名称相同,成员名称不同,那么就会自动合并为一个命名空间;如果命名空间名称相同,成员名称也相同,程序报错。
using namespace A;//将命名空间A中内容全部导入
命名空间的使用
方式一 | 方式二 |
---|---|
名字::成员 | using namespace 名字 |
单一成员导入 | 全部成员导入 |
占用资源小 | 占用资源多 |
嵌套定义
namespace A
{
int count = 5;
namespace B
{
int count =6;
}
}
int main()
{
printf("count = %d",A::B::count);
return 0;
}
程序运行结果
count = 6
std::标准库命名空间,防止与C语言的命名产生冲突
using namespace std;//每次使用C++时都需要在头文件写,或者在每一个cout、endl之前加std::代替
3.输入与输出
在vs2019中使用C++,使用scanf会报错
解决方法:
1.认为安全的版本是使用scanf_s
2.设置常规中的SDL检查设置
3.在最上面头文件加宏
#pragma warning(disable:4996)
scanf("%d", &num);
getchar();//当使用scanf时,在下面一行输入getchar();来解决vs2019上scanf输入的弊端
cout << num << endl;//将数据输入到cout中输出
cout << src << "\n";//endl与"\n"作用相同
cin >> num;
cin >> src;//作用和上面两行相同
注: cin遇到字符串时,到空格就会停止,即不能捕获带空格的字符串