• C++中的赋值运算符重载函数(operator=)


        MyStr& operator =(const MyStr& str)//赋值运算符
        {
            cout << "operator =" << endl;
            if (this != &str)
            {
                if (name != NULL)
                    delete name;
                this->id = str.id;
                int len = strlen(str.name);
                name = new char[len + 1];
                strcpy_s(name, strlen(str.name) + 1, str.name);
            }
            return *this;
        }

    .参数

    一般地,赋值运算符重载函数的参数是函数所在类的const类型的引用(如上面例1),加const是因为:

    ①我们不希望在这个函数中对用来进行赋值的“原版”做任何修改。

    ②加上const,对于const的和非const的实参,函数就能接受;如果不加,就只能接受非const的实参。

    用引用是因为:

    这样可以避免在函数调用时对实参的一次拷贝,提高了效率。

    注意

    上面的规定都不是强制的,可以不加const,也可以没有引用,甚至参数可以不是函数所在的对象,正如后面例2中的那样。

    .返回值

    一般地,返回值是被赋值者的引用,即*this(如上面例1),原因是

    ①这样在函数返回时避免一次拷贝,提高了效率。

    ②更重要的,这样可以实现连续赋值,即类似a=b=c这样。如果不是返回引用而是返回值类型,那么,执行a=b时,调用赋值运算符重载函数,在函数返回时,由于返回的是值类型,所以要对return后边的“东西”进行一次拷贝,得到一个未命名的副本(有些资料上称之为“匿名对象”),然后将这个副本返回,而这个副本是右值,所以,执行a=b后,得到的是一个右值,再执行=c就会出错。

    注意

    这也不是强制的,我们可以将函数返回值声明为void,然后什么也不返回,只不过这样就不能够连续赋值了。

    .调用时机

          当为一个类对象赋值(注意:可以用本类对象为其赋值(如上面例1),也可以用其它类型(如内置类型)的值为其赋值,关于这一点,见后面的例2)时,会由该对象调用该类的赋值运算符重载函数。

    如上边代码中

    str2 = str1;

    一句,用str1为str2赋值,会由str2调用MyStr类的赋值运算符重载函数。

    需要注意的是,

    MyStr str2;

    str2 = str1;

    MyStr str3 = str2;

    在调用函数上是有区别的。正如我们在上面结果中看到的那样。

          前者MyStr str2;一句是str2的声明加定义,调用无参构造函数,所以str2 = str1;一句是在str2已经存在的情况下,用str1来为str2赋值,调用的是拷贝赋值运算符重载函数;而后者,是用str2来初始化str3,调用的是拷贝构造函数。

    详细请看:https://www.cnblogs.com/zpcdbky/p/5027481.html

  • 相关阅读:
    软件工程讲义 3 两人合作(2) 要会做汉堡包
    创新 王屋村的魔方们
    IT 行业的创新 创新的迷思 (56)
    现代软件工程讲义 12 绩效管理
    校园招聘 比较容易的面试题
    技能的反面 魔方和模仿
    现代软件工程讲义 2 工程师的能力评估和发展
    计算机知识体系的三个部分
    不鸣则已 一鸣惊人
    京城名流的聚会
  • 原文地址:https://www.cnblogs.com/curo0119/p/8539070.html
Copyright © 2020-2023  润新知