第一章 C++基础
1.1面向过程、面向对象:
C语言采用一种有序的编程方法—结构化编程:将一个大型程序分解为一个个小型的、易于编写模块,所有的模块有序的调动起来形成了一个程序的完整的运行链。这种结构化编程反映出来过程性编程的思想,即c语言是一门面向过程的语言,更注重程序实现逻辑,怎么更好、更快、更直接的完成某一功能。
C语言是种面向过程编程的语言,在编写大型项目时,并不利于程序的复用性、扩展性,导致了在后期维护时带来了很多繁琐的工作,面临巨大挑战。针对于此,OOP (Object-Oriented Programming)的概念诞生了,与结构化编程不同的是,OOP更注重数据,让语言来满足问题的需求,设计出与问题本质特性相对应的数据格式。
OOD (Object-Oriented Design) :面向对象的设计,OOA (object-Oriented Analysis):面向对象的分析
C++ 是一门面向对象编程的语言,把问题分解成各个对象,建立对象的目的不是为了完成一个步骤而是为了描述某个事物在整个解决问题的步骤中的行为,更注重的是程序的整体设计,方便程序后期维护、优化和管理,让一个功能尽可能的通用。面向对象编程只有一个价值: 应对需求的变化,本意是要处理大型复杂系统的设计和实现。
常说的面向过程和面向对象,其本质还是在其设计思想上
面向过程优点: 性能比面向对象高,比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对象易维护、易复用、易扩展。
面向对象语言优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
缺点:因为类调用时需要实例化,开销比较大,比较消耗资源,性能比面向过程低。
C++是由C衍生出来的一门语言,不但兼容包含了C语言还增加了一些新特性函数重载,类、继承、多态,支持泛型编程(模板函数、模板类) ,强大的STL库等面向对象的三大特性: 封装、继承、多态。
概念介绍: 1.封装: 将零散的数据和算法放到一个集合里,方便管理和使用。
2.复用性:公共功能、过程的抽象,体现为能被重复使用的类、方法,就要求我们针对某一类功能而不是针对某一个功能去设计。
3.扩展性:增加新的功能不影响原来已经封装好的功能
1.2输入、输出
cout: 某一个类型的变量 <<: 输出操作符号,本质上是一个函数 endl: 换行,本质上也是一个函数
cin:某一个类型的变量
::作用域运算符 正常使用格式: 某一个作用域::成员 如果:: 前未指定任何作用域,那么默认取全局的作用域
作用域:描述一个成员所定义的一个范围
#include<iostream>
using namespace std;//打开标准命名空间
int aa = 30;//全局变量
int main()
{
int a = 10;
char b = 'b';
printf("%d %c\n", a, b);
//cout: 某一个类型的变量
//<<: 输出操作符号,本质上是一个函数
//endl: 换行,本质上也是一个函数
cout << a <<" "<< b << endl;
//------------------------------//
scanf_s("%d %c", &a, &b); //c中的输入
cout << a << " " << b << endl;
//cin:某一个类型的变量
//>>: 输出操作符号,本质上是一个函数
cin >> a >> b;
cout << a << " " << b << endl;
//------------------------------//
a = 65;
printf("%c %d\n", a, b);
cout << (char)a << " " <<(int)b << endl;
//------------------------------//
//::作用域运算符 正常使用格式: 某一个作用域::成员 如果 :: 前未指定任何作用域,那么默认取全局的作用域
std::cout << a << " " << b <<std::endl;
//作用域:描述一个成员所定义的一个范围
int aa = 20;
cout << aa << endl;//20 局部优先级高于全局
cout << ::aa << endl; //30 全局的aa
return 0;
}
1.3动态申请空间
c语言中动态申请空间(堆区)采用:malloc(空间大小) 返回值为一个地址。 释放空间:free(空间地址)
c++语言中动态申请空间(堆区)采用:new 数据类型(初始值) 返回值为一个地址 释放空间:delete 空间地址
malloc-free new-delete 区别:
1、malloc-free是C语言中的函数,需要头文件支持,new-delete是C++中提供的关键字,需要C++编译器支持
2、malloc 传申请空间的大小,需要手动计算,返回的是泛型指针(void*)一般强转为需要的类型; new后面接的是要申请的类型,根据类型自动计算空间大小,返回类型不需要强转
3、new申请空间可以指定初始化值,malloc是不能指定初始化值。
4、在申请结构体、类空间时,new申请空间会自动调用构造函数,delete自动调用析构函数;malloc-free则不会
#include<iostream>
using namespace std;
int main()
{
//c:动态申请空间 堆区
int* p=(int* )malloc(sizeof(int));
*p = 10;
cout << *p << endl;
free(p);//释放堆区申请的空间
p = NULL;
/*-----------------------------*/
int arr[] = { 0,1,2 };
int arr2[3];
int size = 0;
cin >> size;
int* p1 = (int*)malloc(size);//申请的空间,可以是一个变化的
free(p1);//释放堆区申请的空间
p1 = NULL;
//------------------------------------------
//c++:动态申请空间 堆区
int* p3 = new int;
*p3 = 20;
cout << *p3 << endl;//20
delete p3; //回收new申请的空间
p3 = NULL;
int* p4 = new int(30);//申请空间的同时,指定初始化值
cout << *p4 << endl;//30
delete p4; //回收new申请的空间
p4 = NULL;
int* p5 = new int();//申请空间的同时,初始化为默认值(当前类型的初值)
cout << *p5 << endl;//0
delete p5;
p5 = NULL;
cout << "-----------------------------" << endl;
int* p6 = new int[2];//new数组 返回的是首元素的首地址(数组空间的首地址)
for (int i=0;i<2;i++)
{
p6[i] = i;
}
for (int i = 0; i < 2; i++)
{
cout << p6[i] << " ";
}
cout << endl;
delete []p6;//回收数组空间 加[]
p6 = NULL;
int* p7 = new int[2]();//申请数组空间,初始化值不能指定,只能是默认值
for (int i = 0; i < 2; i++)
{
cout << p7[i] << " ";
}
cout << endl;
delete[]p7;//回收数组空间 加[]
p7 = NULL;
int* p8 = new int[2]{5,6};//申请数组空间,并指定初始化值
for (int i = 0; i < 2; i++)
{
cout << p8[i] << " ";
}
cout << endl;
delete[]p8;//回收数组空间 加[]
p8 = NULL;
return 0;
}