C++学习笔记(八)------常对象和常方法、拷贝构造函数

文章目录

目录

文章目录

前言

一、常对象和常方法

        1 常对象:

                1.1 常对象的定义:

                1.2 常对象的特性:

        2 常方法:

                2.1 常方法的语法形式

                2.2 常对象与常方法举例

二、拷贝构造函数

        1.拷贝构造函数的分类

        2.编译器所提供的默认拷贝构造形式就是浅拷贝

       3.深拷贝

总结


前言

        随着社会的不断发展,出现了很多的编程语言,但是大部分的代码的底层还是C语言与C++的相关函数,所以学好C++是很有必要的。本文就将继续接着前面七篇的学习笔记进行下面的知识梳理。本篇笔记内容如下:常对象和常方法,拷贝构造函数。


提示:以下是本篇文章正文内容

一、常对象和常方法

        1 常对象:

                1.1 常对象的定义:

                        由const修饰的类型对象或者引用类型对象就是常对象

                1.2 常对象的特性:

                        ①不可以修改本对象的相应属性

                        ②不可以调用类中的普通方法,即常对象只能调用常方法

        2 常方法:

                类中的成员函数的函数体由const修饰,其本质是修饰的成员函数隐藏的this指针类型

                2.1 常方法的语法形式

class  类名

{

        成员函数(行参列表)const  //常方法:本质是修饰this指针

        {

               //在这常方法函数体中不可以出现类对象中属性的修改

                //属性可以被读取

        }

}

                2.2 常对象与常方法举例

//还是采用学生的类进行举例说明

class Stu

{

public:

        string name;

        int score;

public:

        Stu() = default;

        stu(string name, int score)

        {

                this ->name = name;

                this ->score = score;

        }

        void showInfo()const   //const修饰的是隐藏的this指针,

                                              //此时就不能在函数中通过赋值修改属性.

        {

                //需要注意的是全局函数中因为没有this指针,所以不能利用const修饰

                cout << “姓名:” << this->name << “成绩:” << this ->score <<endl;

        }

};

//主函数中

        Stu stu("xiaobai",100);

        stu.showInfo;

二、拷贝构造函数

        1.拷贝构造函数的分类

                拷贝构造函数分为两类,一类是深拷贝,另一类是浅拷贝。这两者的区别请看下文介绍。

        2.编译器所提供的默认拷贝构造形式就是浅拷贝

class  类名

{

public:

        类名(const 类名& other)

        {

                this -> 本对象属性 ...  = other.其它对象属性....

        }

};

举例说明:

//还是采用学生的类

class Stu
{
private:
    string name;
    int score;
public:
    Stu() = default;  //C++11提供的一种构造默认构造函数的方式
    Stu(string name, int score)
    {
        this->name = name;
        this->score = score;
    }
    void showInfo()const
    {
        cout << "姓名:" << this->name << ",成绩:" << this->score << endl;
    }
    ~Stu()
    {
        if(this->p != nullptr) 
        {
            delete [] p;
        }
    }
    //编译器提供默认拷贝构造形式:浅拷贝。
    Stu(const Stu& other)  //拷贝构造和其他的构造函数也构成了重载的关系
    {
        this->name = other.name;
        this->score = other.score;
    }

//主函数中

Stu stu(“xiaobai”,100);

stu.showInfo();

Stu stu1 = stu;        //此时stu1打印出来是姓名:xiaobai,成绩:100

       3.深拷贝

                当类中有着有指针属性的时候,就不能使用浅拷贝,此时就引入了深拷贝的概念。

        

        如果使用浅拷贝的话,此时两个对象的指针指向了同一处的地址空间,如果stu不用了使用delete释放空间,此时会先利用析构将p指针指向的空间析构掉,会导致stu1中的指针变成野指针。

        如果此时在将stu1利用delete释放掉,会造成double free的错误。为了避免这个错误,C++提供了深拷贝。

//引用上面浅构造的例子,在拷贝构造中添加如下

Stu(const Stu& other)  //拷贝构造和其他的构造函数也构成了重载的关系
{
        this->name = other.name;
        this->score = other.score;

        this->p = new int[1024];                 //拷贝原空间中的数据到新的空间之中:        

        memcpy(this->p, other.p,sizeof(int[1024]));
}

        注意:拷贝构造的调用时机有下面的三点:

                1.当定义的本对象使用其它已经构建好的对象进行初始化。

                2.当函数传参时,如果参数为类类型,那么将自动调用拷贝构造。

                3.当函数返回值为类类型时,那么将自动调用拷贝构造。


总结

        以上就是今天要整理的内容,本文简单介绍了拷贝构造函数和常对象和常方法的使用。希望博主整理的知识点能帮助到需要的朋友们。如果发现有问题的地方,请在评论区或者私信帮我指出来,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

译泽在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值