命名的对象是 lvalue

class CText
{
private:
    char *pText;

public:
    void showIt()const
    {
        cout << pText << endl;
    }

    CText(const char* pStr = "No text")
    {
        cout << "CText constructor called" << endl;
        size_t len{ strlen(pStr) + 1 };
        pText = new char[len];
        strcpy_s(pText, len, pStr);
    }

    CText(const CText & txt)
    {
        cout << "CText copy constructor called" << endl;
        size_t len{ strlen(txt.pText) + 1 };
        pText = new char[len];
        strcpy_s(pText, len, txt.pText);
    }

    CText(CText && txt)
    {
        cout << "CText move constructor called" << endl;
        pText = txt.pText;
        txt.pText = nullptr;
    }

    ~CText()
    {
        cout << "CText destructor called" << endl;
        delete[]pText;
    }

    CText & operator=(const CText & txt)
    {
        cout << "CText assignment operator function called" << endl;
        if (this != &txt)
        {
            delete[]pText;
            size_t length{ strlen(txt.pText) + 1 };
            pText = new char[length];
            strcpy_s(pText, length, txt.pText);
        }
        return *this;
    }

    CText & operator=(CText && txt)
    {
        cout << "CText move assignment operator function called" << endl;
        delete[]pText;
        pText = txt.pText;
        txt.pText = nullptr;
        return *this;
    }

    CText operator+(const CText & txt)const
    {
        cout << "CText add operator function called" << endl;
        size_t length{ strlen(pText) + strlen(txt.pText) + 1 };
        CText aText;
        aText.pText = new char[length];
        strcpy_s(aText.pText, length, pText);
        strcat_s(aText.pText, length, txt.pText);
        return aText;
    }
};

GGGG

class CMessage
{
private:
    CText  m_Text;

public:
    void showIt()const
    {
        m_Text.showIt();
    }

    CMessage operator+(const CMessage & aMess) const
    {
        cout << "CMessage add operator function called" << endl;
        CMessage message;
        message.m_Text = m_Text + aMess.m_Text;
        return message;

    }

    CMessage & operator=(const CMessage & aMess)
    {
        cout << "CMessage assignment operator function called" << endl;
        if (this != &aMess)
        {
            m_Text = aMess.m_Text;
        }
        return *this;
    }

    CMessage & operator=(CMessage && aMess)
    {
        cout << "CMessage move assignment operator function called" << endl;
        m_Text = aMess.m_Text;
        return *this;
    }

    CMessage(const char * str = "Default message")//:m_Text{ str }//m_Text { CText(str) }
    {
        cout << "CMessage constructor called----" << endl;
        m_Text = CText(str);
    }

    CMessage(const CMessage & amess)
    {
        cout << "cmessage copy constructor called" << endl;
        m_Text = amess.m_Text;
    }

    CMessage(const CMessage && amess)
    {
        cout << "cmessage move constructor called" << endl;
        m_Text = amess.m_Text;
    }
};

int main()
{
    CMessage motto1{"The devi1 takes care of his own.\n"};

    cout << "----------------------------------------" << endl;

    CMessage motto2{"if yuo sup with the devil use a long spoon.\n"};

    cout << "----------------------------------------" << endl;

    CMessage motto3{motto1+motto2};

    cout << "----------------------------------------" << endl;

    motto3.showIt();
}
时间: 2025-01-02 13:25:55

命名的对象是 lvalue的相关文章

SQL Server使用sp_rename重命名约束注意事项

在SQL Server中,我们可以使用sp_name这个系统存储过程重命名数据库中对象的名称. 此对象可以是表. 索引. 列. 别名,约束等数据类型(具体可以参考官方文档).上周在使用这个函数重构数据库中约束的时候,遇到了下面错误,如下所示: USE AdventureWorks2014; GO sp_rename 'ErrorLog.DF_ErrorLog_ErrorTime', 'DF_ErrorLog_ErrorTime_old'; GO Msg 15225, Level 11, Stat

Log4 配置简介

本文主要解释log4j的配置文件各个配置项的含义,内容是从网上转载的 第1章. Log4j 的优点 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. log4j的好处在于: 1) 通过修改配置文件,就可以决定log信息的目的地——控制台.文件.GUI组件.甚至是套

零基础学python-10.2 多目标赋值与变量命名规则

1.多目标赋值 >>> a=b=c='abc' >>> a,b,c ('abc', 'abc', 'abc') >>> 2.多目标赋值与共享引用 对于不可变对象是没有问题,但是对于可变对象,这里就有问题的了 >>> a=1 >>> b=a >>> b=a+1 >>> id(a) 505991632 >>> id(b) 505991648 >>>

Objective-C之优雅的命名

There are only two hard things in Computer Science: cache invalidation and naming things. 在计算机科学中只有两件难事:缓存失效和命名. — Phil Karlton 计算机语言是人和计算机之间通讯的媒介.好的代码应该是就像人对计算机说话那样,自然而优雅.命名看上去是一件很简单的事,而往往越是简单的事越难 做好,否则大师们也不会把命名看成是计算机界的难题了.如何把Objective-C这门计算机语言以优雅的方

Objective-C 之优雅的命名(转)

There are only two hard things in Computer Science: cache invalidation and naming things. 在计算机科学中只有两件难事:缓存失效和命名. — Phil Karlton 计算机语言是人和计算机之间通讯的媒介.好的代码应该是就像人对计算机说话那样,自然而优雅.命名看上去是一件很简单的事,而往往越是简单的事越难做好,否则大师们也不会把命名看成是计算机界的难题了.如何把Objective-C这门计算机语言以优雅的方式

Java命名和目录接口——JNDI

JNDI即Java命名和目录接口(JavaNaming and Directory Interface),它属于J2EE规范范畴,是J2EE的核心技术之一,提供了一组接口.类和关于命名空间的概念.JDNI是provider-based技术,它暴露一个API和一个服务供应接口(SPI).它将名称和对象联系起来,使我们可以用名称访问对象.我们可以把JNDI简单地看成是里面封装了一个name到实体对象的映射,通过字符串可以方便得到想要的对象资源,例如JDBC.JMail.JMS.EJB等.这意味着任何

第二课 第六节 面向对象(对象与类)、命名规范

1.面向对象 --一切事物皆对象,通过面向对象的方式,将现实世界的事物 抽象成对象,现实世界中的关系抽象成类.继承,帮助人们 实现对现实世界的抽象与数字建模. 2.对象 --对象是具体存在的.看得见.摸得着.可以直接使用的东西. 3.类 --类的实质是一种数据类型,类是对现实生活中一类具有共同特 征的事物的抽象. 4.变量的命名规范 --变量名应该是一个名词 --如果只有一个单词则全部小写,如果多个单词,除一个单词 以外,其余首字母大写.若变量是缩写,应该全部大写. --变量命名要有意义,不能乱

IOS-学习系统的命名方式

命名,未必适合每一个人 当我打开xcode 开始写东西的时候,取名字总是让我很纠结. 我认为应该养成一个好的命名习惯,一个好的名字总是让人赏心悦目. 我的英文不是很好所以我的工程名一般是中文,便于快速找到. 命名变量,声明一个方法的时候我觉得还是好好想一个名. 命名一个对象: 对象名+类型缩写(首字母小写) 首先要思考这个对象是用来做什么的,是什么类型. 先想一个中文名,比如说我要命名一个按钮(UIButton)的对象,button是个发送按钮的,所以我们可以用sendBnt(想要的名字后面加类

软件版本命名规范

  1.版本命名规范 软件版本号有四部分组成,第一部分为主版本号,第二部分为次版本号,第三部分为修订版 本号,第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有五种,分别为base.alpha.beta .RC . release   2.软件版本阶段说明 Base:此版本表示该软件仅仅是一个假页面链接,通常包括所有的功能和页面布局,但是    页面中的功能都没有做完整的实现,只是做为整体网站的一个基础架构. Alpha :软件的初级版本,表示该软件在此阶段以实现软件功能为主,通常只在软件