C++: Struct Operations

Assume the following declaration
```//--- Define a new struct type
struct Point {
int x;
int y;
};

//--- Declare some variables of type Point.
Point p1;
Point p2;
Point* paddr;  // declare pointer to a Point struct
```

Member (field) selection - dot operator

The "." (dot) operator is used to select a member of a struct. This operator can be applied to any expression that yields a struct (function call, subscription, etc).
```int h = p1.x;
p2.y = p1.y;```

Member (field) selection - arrow operator

When using a pointer to a struct, the "->" (arrow) operator is typically used as a more readable way to both dereference the pointer and select a member. See -> operator.
```// The following are equivalent.
int h = paddr->x  // using arrow notation.
int h = (*paddr).x;  // using deref plus dot.```

Assignment

A struct variable can be assigned to/from.
`p1 = p2;`

Parameter

A struct can be passed to a function either as a value or a reference parameter. Large structs are sometimes passed as reference parameters to avoid the cost of the copy, even tho the value is not going to be changed.

Returned by function

A struct may be returned by a function.

Comparison - NO

The comparison operators do not work on structs. To compare structs, compare individual fields.
`if (p1.x==p2.x && p1.y==p2.y) . . .`
It is not possible to write `p1==p2`.

There are good reasons to forbid comparison.

• What would a greater than comparison even mean on a Point for example.
• A bit-by-bit equal comparison is not feasible in general because there may be padding or unfilled elements (eg in a C-string).

A subelement of array or another struct

A struct value can be used inside of another struct or as an element type in an array.

Arithmetic operators - NO

By default none of the arithmetic operators work on structs.

I/O - NO

The I/O operators >> and << do not work for structs; you must read/write the fields individually.

Solutions

You may redefine operators so that they do work with your structs. When providing functions and overloaded operators for your struct, use the `class` keyword instead -- it's what programmers expect. See Operator Overloading.