//*******************深拷贝与浅拷贝*******************//
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
自己实现拷贝构造函数,解决浅拷贝带来的问题
例子:
Person(const Person &p)
{
m_Age=p.m_Age;
m_Height=new int(*p.m_Height);
}
或者重载加号运算符
//*******************构造函数理解*******************//
在C++中,当你在类中定义了一个带参数的构造函数时,编译器将不再提供默认的无参构造函数。这是因为带参数的构造函数会覆盖默认的无参构造函数。当你需要无参构造函数时,需要自己添加一个进去。
//*********析构函数理解**********//
主要用于在对象销毁前系统自动调用,执行一些清理工作
//*********运算符重载************//
重载+号时,可以用成员函数重载 或 全局函数重载
person operator+(person& p)//成员函数重载+号
//2、全局函数重载+号
person operator+(person& p1, person& p2)
两者所需的形参不同,全局函数重载时,不容易调用私有成员变量,需要添加友元函数才能调用(全局函数更安全)
//*******************左移运算符重载*******************//
利用成员函数重载左移运算符 p.operator<<(cout) 简化版本p<<cout
所以不会利用成员函数重载<<运算符,因为无法实现cout在左侧
只能利用全局函数重载左移运算符
ostream &operator<<(ostream &out,Person &p)//本质 operator<<(cout,p)简化cout<<p;
若需要访问私有成员时,需要添加友元函数
//*******************递增运算符重载*******************//
重载前置++运算符(先自增再赋值)
MyInteger & operator++()//需要返回引用值,否则当存在++(++i)时,括号外的++不能改变值
{
m_Num++;//先对类内某个成员变量进行++运算
return *this;//再将自身做返回
}
//重载后置++运算符 (先赋值再自增)
//void operator++(int ) int代表占位参数,可以用于区分前置和后置递增
MyInteger & operator++(int)//不可返回引用值,因为是局部变量,空间被回收
{
//先记录当时结果
MyInteger temp=*this;
//后 递增
m_Num++;
//最后将记录结果返回
return temp;
}
//*******************赋值运算符重载*******************//
Person& operator=(Person &p){ //返回值为自身的引用 原因为避免 对象1=对象2=对象3
//编译器是提供浅拷贝
//m_Age=p._Age; //浅拷贝,会使得两个对象指针指向相同地址,也或者没有申请空间,还有原空间没释放
//应该先判断是否有属性在堆区,如果有 先释放干净,然后再深拷贝。
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
//深拷贝
m_Age = new int(*p.m_Age);
return *this;
}
//*******************关系运算符重载*******************//
bool operator==(Person& p)
{
if (*this->m_Age == *p.m_Age && this->m_Name == p.m_Name) {
return true;
}
return false;
}
bool operator!=(Person& p)
{
if (*this->m_Age != *p.m_Age && this->m_Name != p.m_Name) {
return true;
}
return false;
}
两者都需要返回判断出来的结果,用bool值返回。
//*******************继承--构造函数和析构函数*******************//
继承中的构造和析构顺序如下:
先构造父类,再构造子类,析构的顺序与构造的顺序相反
//*******************继承同名成员处理方式*******************//
访问子类同名成员 直接访问即可
访问父类同名成员 需要加作用域
当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
//*******************多继承语法*******************//
C++允许一个类继承多个类
多继承可能会引发父类中有同名成员出现,需要加作用域区分
语法:class 类名:继承方式 父类1,继承方式 父类2...{}
//*******************模板*******************//
1、自动类型推导,必须推导出一致的数据类型T才可以使用
2、模板必须要确定出T的数据类型,才可以使用
//*******************普通函数与函数模板的区别*******************//
普通函数调用时可以发生自动类型转换(隐式类型转换)
函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
如果利用显示指定类型的方式,可以发生隐式类型转换
//****调用规则:****//
如果函数模板和普通函数都可以实现,优先调用普通函数
可以通过空模板参数列表来强制调用函数模板
函数模板也可以发生重载
如果函数模板可以产生更好的匹配,优先调用函数模板
//*******************类模板基本语法*******************//
类模板和函数模板语法相似,在声明模板template后面加类,此类称为类模板
//*******************类模板对象做函数参数*******************//
1.指定传入的类型 ----直接显示对象的数据类型
2.参数模板化 ----将对象中的参数变为模板进行传递
3.整个类模板化 ----将这个对象类型 模板化进行传递
通过类模板创建的对象,可以有三种方向函数中进行传参
使用比较广泛时第一种:指定传入的类型
//*******************常用算法*******************//
算法主要是由<algorithm><functional><numeric>组成
<algorithm>是所有STL头文件中最大的一个,范围涉及到比较,交换,查找,遍历操作,修改等等
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
<functional>定义了一些模板类,用以声明函数对象
for_each//遍历容器
transform//搬运容器到另一个容器中
//**********************文件打开方式*******************//