C++复试第七篇——拷贝、运算符重载、继承、动态绑定

文章详细介绍了C++中的拷贝构造函数,用于对象的值传递和初始化;拷贝赋值操作符,确保正确处理对象间的赋值;析构函数,用于清理对象使用过的内存;以及运算符重载的概念和规则,包括哪些运算符可以被重载以及如何重载。此外,还强调了深拷贝和浅拷贝的区别以及在内存管理中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、拷贝构造

二、拷贝赋值

三、析构函数        

四、运算符重载


一、拷贝构造

        1.

拷贝构造函数是什么?什么时候用它

       一个构造函数的第一个参数是自身类 ,(人拷贝人,猪拷贝猪)且其他参数都有默认值

        (1)一个对象作为函数参数,以值传递的方式传入函数体;

        (2)一个对象作为函数返回值,以值传递的方式从函数返回,非引用;

        (3)一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

        (4)用花括号列表初始化一个数组中的元素或一个聚合类成员。

        如果没有写拷贝构造函数,对一个用new出来的对象,编译器会进行复制默认只修改指针,也称 “ 浅拷贝 ” ,会造成内存泄漏别名危险

#include <string>
using std::string;


|'用一个SString类构造一个SString类'
SString::SString(const SString & str)
{
    m_data = new char[strlen(str.m_data) +1];
    strcpy(m_data, str.m_data);
}

SString s1("hello world");
SString s2(s1);
|s2与s3都是由构造函数而来,因为s3是新的对象,需要构造
SString s3 = s1;

        2. 直接初始化和拷贝初始化的区别?

        显式调用各版本的构造函数就是直接初始化,利用函数匹配

        拷贝初始化发生于未显式调用构造函数但是却生成了类的对象的场合,比如函数返回值等场合。

二、拷贝赋值

        1. 先清空自己,再创建一个与想copy的对象相应大小的空间,再拷贝过来

SString& SString :: operator = (const String& str)
{
    //检测自我赋值,如果不检测先delete值,就无法存取了
    if(this == &str)
        return *this;

    delete[] m_data;
    m_data = new char[strlen(str.m_data)+1];
    //+1是因为还要加上'\0'
    strcpy(m_data,str.m_data);

    return *this; 
}

        2. 重载运算符:本质上是函数,有返回类型参数列表 

三、析构函数        

        1. 用来写在变量和清理使用过的内存,new delete,栈的使用释放都会使用到析构。析构函数会在main函数执行完后,开始调用,样式是 “ ~ ” 加上类名,和构造函数对应

        无返回值无参数  -> 只有一个,不可以被重载

四、运算符重载

        1. 运算符就是一个函数,定义形式是 “ return type ” operator" 符号 "()

        2. C++标准规定,不能重载的运算符有:

类属关系运算符“   ”   成员指针运算符“ .* ”   作用域分辨符“ :: ”    三目运算符“ ?:

。必须重载为成员函数的运算符有:赋值运算符“=”、取下标运算符“[]”、成员访问运算符“->”和函数运算符“()”。

        3. 

一个重载的函数调用运算符应该接受几个运算对象?

        可以接受的对象为0-256个。

        4. 对于成员访问运算符,解引用符“ * ” 可以任意指定任何操作,但是箭头运算符“ -> ”不可以丢掉成员访问的含义

        对于  point“ -> ”mem,point必须得是

                (1)类对象的指针                                            相当于(*point).mem

                (2)一个重载了operator“ -> ”的类对象            相当于point.operator() -> mem

        5. ()函数调用符,必须得是类内的成员函数;定义了调用运算符的类,被称作函数对象

        6. type()类型转换运算符,e.g:int( ),可以把一个类转化成其他的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值