C++笔记

本文详细讲述了C++中的深拷贝与浅拷贝的区别,构造函数和析构函数的作用,以及运算符重载、继承、模板、类模板对象作为函数参数等关键概念。
摘要由CSDN通过智能技术生成

//*******************深拷贝与浅拷贝*******************//
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
自己实现拷贝构造函数,解决浅拷贝带来的问题 
例子:
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//搬运容器到另一个容器中

//**********************文件打开方式*******************//

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值