C++基础
面向对象编程
一切皆对象,将现实世界中的事物抽象成对象,用对象去处理相应的实际的问题
命名空间
在全局范围之内取一块区域并命一个名称
动态内存
c++的动态内存与c的的异同:
malloc/free和new/delete都是在堆区申请空间和释放堆区空间
不同点:
(1)类型:C里的malloc/free是函数,C++里new/delete是一个操作符
(2)初始化:C里的malloc/free开辟堆区空间的时候不能进行初始化的工作,C++里的new/delete开辟空间的时候能进行初始化工作
(3)分配空间:C里的malloc/free开辟堆区空间的时候需要手动的去计算空间的大小,C++里的new/delete开辟空间的时候自动计算空间的大小(根据数据类型而定)
(4)堆空间类型:C里的malloc/free开辟堆区空间的时候需要强制类型转换,C++里的new/delete开辟空间的时候不需要强制类型转换
(5)C里的malloc/free仅仅只是做了开辟堆区空间的工作,没有做其他的工作,C++里的new/delete开辟空间的时候,不仅仅只是开辟了空间,而且还可以执行构造函数(完成变量的初始化工作)
类和对象
类是对一类东西的描述,比如动物,有四肢,毛发颜色,声音,水生还是陆生…,通常将这些属性作为类的属性; 然后将跑步,飞行,吃,喝,唱,跳,rap…作为函数进行描述。通过函数调用属性,达到函数要执行的操作。
万事万物皆对象,任何事物都可以是对象,C++当中的对象就是将类进行实例化,具体到万事万物,比如动物类,具体一下到什么动物,猫,狗,猪…等等.
构造函数
在实例化对象的时候编译器自动执行,将对象的属性具体化,比如把人当作一个类就是具体人的腿多长,多高,年纪多大,是男是女…
虚函数
在类继承调用函数的时候
#include "iostream"
#include"iomanip"
using namespace std;
class animal
{
public:
void getcry()
{
cout<<"animal"<<endl;
}
};
class dog :public animal
{
public:
void getcry()
{
cout << "汪汪"<<endl;
}
};
class cat :public animal
{
public :
void getcry()
{
cout << "喵喵" << endl;
}
};
void Cry(animal &a)
{
a.getcry();
}
int main()
{
cout << "cat cry:" << endl;
Cry(a);
cout << "dog cry:" << endl;
Cry(d);
}
运行结果:
class animal
{
public:
virtual void getcry()//将getcry定义为虚函数
{
cout<<"animal"<<endl;
}
};
运行结果:
虚函数表:
当类中定义虚函数的时候,编译器会自动生成一个虚函数表,继承虚函数的时候子类也会将继承的虚函数加入自己的虚函数表;当调用指针或者引用调用虚函数的时候,编译器就会去虚函数表中找到对应的虚函数执行。
虚函数总结
当类指针或者引用的对象调用的方法不是虚函数,会自动匹配当前对象类型(指针的类型或者引用的类型)的函数;将函数定义为虚函数,指针或者引用就会找到实际的对象类型(指针指向的数据类型或者引用的数据类型)而去匹配对应的方法(函数),就是动态绑定。
静态绑定:在编译阶段就将调用的函数确定下来了。
多态是面向对象编程的关键之一,而通过虚函数实现动态绑定,将多态的意义充分体现。
模板
模板相当于一个模具,固定的形状,但是当原料(数据类型)不一样的时候,生产出来的东西(对象)就不同。
函数模板:
template <模板形参1,模板形参2,.......> 函数的返回值 函数名(函数形参列表)
{
//函数体
}
类模板:
template <模板形参> class 类名
{
//类体
};
例如:
template <class T1>class Test
{
public:
T1 a;
Test(T1 b)
{
a = b;
cout << "a=" << a << endl;
}
};
类模板实例化:类名<数据类型>对象名(构造函数的参数列表);
例如:
Test<int>test(10);