Skip to main content

C++: Operator= returns const reference of *this or reference of *this?

Abstract

Recently, I started to use cppcheck. cppcheck suggested me that the return type of operator= should reference of (*this). But I thought this should be const reference of (*this). I thought the reason of this.

Contents

Cppcheck is an static analysis tool for C/C++ code. (http://cppcheck.sourceforge.net/) I found this tool is quite useful since it sometimes finds a memory leak error and so on. However, the following code has some style error at the operator=.

#include 
class OpTest {
public:
    /// constructor
    OpTest(int init_int) : m_int(init_int){
        // empty
    }
    /// operator= with const reference
    OpTest const & operator=(OpTest const & rhs){
        if(this != &rhs){
            m_int = rhs.m_int;
        }
        return *this;
    }
public:
    int m_int;
};

cppcheck said:
[operator_substitute_00.cpp:9]: (style) 'OpTest::operator=' should return 'OpTest &'.
I thought when I finished substitution of an instance, I consider the instance (= *this) should be const. Therefore, I was puzzled when I saw this message. I look up web, but I could not find a page that explains why this should be. Although, many of code returns just a reference of (*this).

I asked several colleagues about this. Then Ali answered me that: maybe you can call the non const method after the substitution. The following code is an example.
OpTest a(0);
OpTest b(1);
(a = b).non_const_method();
I see a point, but personally, I would prefer the following code.
OpTest a(0);
OpTest b(1);
a = b;
a.non_const_method();

Comments

Hi!

I am a cppcheck developer and I saw this post.

Yes there are good safety reasons to use const. But I still recommend that you don't use const.

The reason you should return a non-const reference is for consistency. That is how the old C types such as int, char, short, etc work. That is how the C++ types such as std::string, std::vector, etc work.

This is valid C code:
int a = 1, b = 2;
int &c = (a = b);
c = 3; // modify a

Similar code can be written using std::string, std::vector, etc.

Regards, Daniel
Shitohichi said…
Thanks for the comment. I see now why cppcheck suggests this.

Also thanks for the cppcheck, that's a great free software.

Popular posts from this blog

Why parallelogram area is |ad-bc|?

Here is my question. The area of parallelogram is the difference of these two rectangles (red rectangle - blue rectangle). This is not intuitive for me. If you also think it is not so intuitive, you might interested in my slides. I try to explain this for hight school students. Slides:  A bit intuitive (for me) explanation of area of parallelogram  (to my site, external link) . 

Geometric Multiplicity: eignvectors (2)

If eigenvectors of a matrix A are independent, it is a happy property. Because the matrix A can be diagonalized with a matrix S that column vectors are eigenvectors of A . For example, Why this is a happy property of A? Because I can find A's power easily. A^{10} is not a big deal. Because Λ is a diagonal matrix and power of a diagonal matrix is quite simple. A^{10} = SΛ^{10} S^{-1} Then, why if I want to compute power of A ? That is the same reason to find eigenvectors. Eigenvectors are a basis of a matrix. A matrix can be represented by a single scalar. I repeat this again. This is the happy point, a matrix becomes a scalar. What can be simpler than a scalar value. But, this is only possible when the matrix S's columns are independent. Because S^{-1} must be exist. Now I come back to my first question. Is the λ's multiplicity related with the number of eigenvectors? This time I found this has the name. Geometric multiplicity (GM): the number of in...

Tezuka Osamu's Black Jack, "Shrinking"

I like several novel authors. My first favorite author is probably Teduka, Osamu. I still love him. The list grows by adding Hoshi, Shinichi, Agatha Christie, Hermann Hesse, and so forth. My first favorite article of Tezuka was Atom as most of the (boy's) Tezuka fans did. But my favorite is Black Jack. I try to summarize one story, it is still quite vivid in my memory. I first read this story when I was 13 - 15 years old. I re-read it at least several times since Black Jack is composed of many short episodes. The title should be "ちぢむ (SHRINKING)" or it might be "縮む(Shrinking)". (It is not so convenient to translate this to English, since English does not have a system to say the exact same word in several ways. So I just simulate it with capital letters.) Black Jack is a genius surgeon, but he does not have the license. In short, his medical activity is illegal. His skill is top level in the world, but, the fee is also out-of-law expensive. In the story ...