When I first joined C++, I was confused about some terminology, but now that I've looked it up, I understand now.
I'm here to share my wisdom in the form of a compilation of phrases I've learned.
lvalue
and rvalue
An lvalue, or properly cased, "LValue", stands for "Left Value". Same with "RValue"; it means "Right Value".
A left value is any bit of code that can go on the left side of an expression, and is strictly limited to only being that left-hand of the expression.
Here's an example:
int const x = 10; // `x` is an lvalue, and `10` is an rvalue. int y = 20; // `y` lvalue, `20` rvalue. y = y+x; // `y` is an lvalue, `y+x` is an rvalue. // `y+x` is an rvalue because you can't do // `int x+y = value`.
reference
, lvalue reference
, and rvalue reference
.
A reference is a tool that's used to pass a variable (or its value) around.
Consider the following:
void updateYear(int& y) { y = 2021; } int year = 2006; updateYear(year); std::cout << year; // Prints `2021`.
They're basically similar to pointers (T* name
), except they're dereferenced when applicable, and are ensured never to be a null
-like value.
What's an lvalue reference? - Well, it's not hard to explain, it's what you you just witnessed.
Reference usually refers to any reference, it's not specific, but before rvalues were added to C++ (in C++11), "reference" referred to the only kind of references that existed, lvalue references.
Copy constructor.
It's exactly what it sounds like, a constructor that copies.
What does it copy? Another instance of the same type.
It creates a new instance of a type using an old instance.
Here's an example:
struct Point { // The following constructor is a "copy constructor" // because it takes an argument of type `Point`, // which is the same type as the class it's in. // (NOTE: Copying data from `p` isn't a requirement // for a copy-constructor, but doing otherwise // defeats the purpose of having `p`.) Point(Point p) { // I'm not using a member-initializer list to // be beginner friendly. // More people know `this.name`/`this->name` syntax. this->x = p.x; this->y = p.y; } int x = 0; int y = 0; }
Top comments (0)