operator = 为什么要返回*this的应用

Effictive c++中将要让operator =()返回*this的引用,原因说是为了连环赋值,测试一下,发现不是如此,参考http://blog.csdn.net/nodeathphoenix/article/details/38146421

class Test {
public:
    Test():num(0) {
    }
    Test(int n) :num(n) {
    }
    Test(const Test &test):num(test.num) {
    }
    Test operator =(Test &test) {
        num=test.num;
        return *this;
    }
    void Show(const Test &test) {
        std::cout << num <<std::endl;
        std::cout << test.num << std::endl;
    }
    ~Test() {
    };
private:
    int num;
};

一样可以连环复制,如

Test a,b,c(10);
a=b=c;

结果a,b,c都是10

但是如果

Test a,b,c(10);
(a=b)=c;

a,b都是0了,原因如下:

a=b的函数执行过程中,会创建临时变量,之后再通过copy构造函数构造a,而(a=b)=c其实是把c赋值给临时变量,所以并没有影响到a的值。

如果返回引用,则不存在这个问题,而且少调用了两次copy构造函数,效率也更高。

通过这个我发现,类的成员函数是可以访问类的任何实例的私有变量,如上面的Show(Test &test)函数。因为类的成员函数是跟类绑定在一起的,而不是跟类的实例绑定的。而且,类的成员函数不占用类的实例的空间。

operator = 为什么要返回*this的应用

时间: 2024-10-12 19:51:20

operator = 为什么要返回*this的应用的相关文章

Effective C++ Item 10 令operator= 返回一个reference to *this

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:令赋值(assignment)操作符返回一个reference to *this --> 这样可以实现级联赋值 示例: #include <iostream> #include <string> using namespace std; class Widget{ public: Widget(int v):value(v){} Widget& opera

C++ 中 new 操作符内幕:new operator、operator new、placement new

原文链接 一.new 操作符(new operator) 人们有时好像喜欢有益使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: string *ps = new string("Memory Management"); 你使用的new是new操作符. 这个操作符就象sizeof一样是语言内置的.你不能改变它的含义,它的功能总是一样的.它要完毕的功能分成两部分.第一部分是分配足够的内存以便容纳所需类型的对象.

条款23: 必须返回一个对象时不要试图返回一个引用

class rational { public: rational(int numerator = 0, int denominator = 1); ... private: int n, d; // 分子和分母 friend const rational // 参见条款21:为什么 operator*(const rational& lhs, // 返回值是const const rational& rhs) }; inline const rational operator*(cons

c++,operator=

operator=为什么值得注意? 从语法上讲,下面的程序可以编译通过,我在另一篇笔记示例里面也这样用了. class A1 { public: int operator=(int a)//参数是int,语法通过但逻辑不通. { return 8; } int operator+(int a) { return 9; } int operator=(A1 &a)//返回int,既无意义也不合逻辑, { cout<<"operator=(A1 &a)"<

在必须返回一个对象时,不要去尝试返回一个引用

一旦程序员把注意力都转向了对象传值方式隐含的效率问题(参见第 20 条)时,许多人都变成了极端的“改革运动者”,他们对传值方法采取斩草除根的态度,在他们不屈不挠追求传递引用方式的纯粹性的同时,他们也犯下了致命的错误:有时候传递的引用所指向的对象并不存在.这决不是一件好事情. 请看下面的示例,其中的 Rational 类用来表示有理数,其中还包括一个函数来计算两个有理数的乘积: class Rational {public:  Rational(int numerator = 0, int den

小结:c++中的new、operator new和placement new

c++中的new.operator new和placement new 一.new new(也称作new operator),是new 操作符,不可重载 class T{...}; T *t = new T(initial_args_list); //此时的new ,是new 操作符 new操作 会执行以下三个步骤 调用类的(如果重载了的话)或者全局的operator new分配空间 用类型后面列的参数列表来调用构造函数,生成类对象 返回对应的指针 二. operator new operato

operator模块常见方法介绍

operator.concat(a, b) 对于 a.b序列,返回 a + b(列表合并) --------------------------------- operator.countOf(a, b) 返回 b 在 a 中出现的次数 perator.delitem(a, b) 删除 a 中索引为 b 的值 operator.getitem(a, b) 返回 a 中索引为 b 的值 operator.indexOf(a, b) 返回 b 在 a 中首次出现位置的索引值. operator.se

重载[] int&amp; operator[ ]( )

https://blog.csdn.net/qq_29344757/article/details/76855218 格式: 返回类型& operator[] (输入参数列表); 注意返回的是引用: 重载操作符的原则是不能改变操作符的原有语义和操作数的个数: "[]"用于取元素的值,且只有一个操作数,为括号内的值,这个是不可被改变的,但是括号内的值是针对该数组而操作的,所以"[]"操作符肯定有一个数组对象,这也就决定了对"[]"的重载实现

C++内存管理(new operator/operator new/operator delete/placement new)

new operator 我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的 比如: string *ps = new string("Memory Management"); 相当于 void *memory = operator new(sizeof(string)); // 得到未经处理的内存,为String对象 call string::string("Memory Management&