## Summary

In this post, I will introduce `const`

, `*`

and `&`

and their combinations. I also have similar posts discussed `auto`

and `&`

.

## Conclusion

As usual, I present the golden rule first: **“read from right to left”**. In other words, the **const-on-the-right style** always puts the const on the right of what it constifies”.

- When you want a pointer which can not change the object, use
`CNN const * cnn_ptr = new CNN(model);`

; - When you want a pointer which can not point to other objects, use
`CNN * const cnn_ptr = new CNN(model);`

; - When you want a pointer which can not change the object and can not point to other objects, use
`CNN const * const cnn_ptr = new CNN(model);`

- When you want a reference which can not change the object, use
`CNN const & cnn_ref = model;`

;

## Details

### 1. `const CNN *`

or `CNN const *`

Read it from right to left. `CNN const * cnn_ptr`

means “cnn_ptr points to an CNN instance that is const”: the CNN object can’t be changed via `cnn_ptr`

. `CNN const * cnn_ptr`

is equivalent to `CNN const * cnn_ptr`

. However, I prefer the former, which is the **const-on-the-right** style.

The const-on-the-right is a consistent style: it always puts the const on the right of what it constifies. In which, a local variable that is const is defined with the const on the right: `int const a = 42;`

. Similarly a static variable that is const is defined as `static double const x = 3.14;`

. Basically every const ends up on the right of the thing it constifies.

### 2. `CNN * const cnn_ptr`

Read it from right to left. `CNN * const cnn_ptr`

means “cnn_ptr is a const pointer to an CNN instance that is non-const”: you can’t change the pointer cnn_ptr itself, but you can change the CNN object via the cnn_ptr. `const`

constifies `*`

, which makes us happy.

### 3. `CNN const * const cnn_ptr`

Read it from right to left. It means “cnn_ptr is a const pointer to an CNN instance that is const”: you can’t change the pointer cnn_ptr itself, nor can you change the CNN instance via cnn_ptr.

### 4. `CNN const & cnn_ref`

Read it from right to left. “cnn_ref is a reference to a const CNN”. `CNN const & cnn_ref`

is equivalent to `const CNN & cnn_ref`

.

### 5. `CNN & const cnn_ref`

???

“cnn_ref is a const reference to a CNN”? It makes no sense. Once combined, cnn_ref can not combine other instances. That is, `CNN& const cnn_ref`

is always equivalent to `CNN& cnn_ref`

.