struct Point {
double x;
double y;
};
// | double | double |
struct Segment {
Point p1;
Point p2;
};
// | Point | Point |
// | x | y | x | y |
.
#include <cmath>
double length (Segment s) {
double dx = s.p1.x - s.p2.x;
double dy = s.p1.y - s.p2.y;
return sqrt (dx * dx + dy * dy);
}
->
.
double length (Segment * s) {
double dx = s->p1.x - s->p2.x;
double dy = s->p1.y - s->p2.y;
return sqrt (dx * dx + dy * dy);
}
Point p1 = { 0.5, 0.5 };
Point p2 = { 1.2, 6.3 };
Segment s = { p1, p2 };
struct IntArray2D {
size_t a;
size_t b;
int ** data;
};
IntArray2D a = { n, m, create_array2d(n, m) };
this
, который указывает на текущий объект.
// point.hpp
struct Point {
double x;
double y;
void shift (double x, double y);
};
// point.cpp
void Point::shift(double x, double y) {
this->x += x;
this->y += y;
}
struct Point {
double x;
double y;
Point () {
x = 0;
y = 0;
}
Point (double x, double y) {
this->x = x;
this->y = y;
}
};
Point p1; // {0, 0};
Point p2(3,7);
struct Point {
double x;
double y;
Point () : x(0), y(0) {}
Point (double x, double y) : x(x), y(y) {}
};
struct Point {
double x;
double y;
Point (double x = 0, double y = 0)
: x(x), y(y) {}
};
explicit
.
cpp
struct Point {
double x;
double y;
explicit Point (double x = 0, double y = 0)
: x(x), y(y) {}
};
Point p = 12; // error (without explicit keyworkd this code works)
Point p1; // определение переменной
Point p2; // объявление функции
double k = 5.1;
Point p3( int(k) ); // объявление функции
Point p4( (int)k ); // определение переменой
struct IntArray {
size_t size;
int * data;
explicit IntArray(size_t)
: size(size),
data(new int [size])
{ }
~IntArray() {
delete [] data;
}
};
delete
struct IntArray {
...
private:
size_t size_;
int * data_;
};
int main() {
IntArray a1(10);
IntArray a2(20);
}
void some_function(IntArray a) {
....
}
IntArray a = IntArray(4);
some_function(a);
struct IntArray {
IntArray(IntArray const & a)
: size(a.size_), data_(new int[size_]) {
for (size_t i = 0; i < size_; ++i) {
data_[i] = a.data_[i];
}
}
};
struct IntArray {
IntArray & operator=(IntArray const & a) {
if (this != &a) {
delete [] data_;
size_ = a.size;
data_ = new int[size_];
for (size_t i = 0; i < size_; ++i) {
data_[i] = a.data_[i];
}
}
return *this;
}
}
swap
(swap меняет поля текущего объекта и объекта в аргументе)
#include <algorithm>
struct IntArray {
void swap(IntArray & a) {
std::swap(size_, a.size_);
std::swap(data_, a.data_);
}
IntArray(IntArray const & a)
: size(a.size_), data_(new int[size_]) {
for (size_t i = 0; i < size_; ++i) {
data_[i] = a.data_[i];
}
}
IntArray & operator=(IntArray const & a) {
if (this != &a) {
IntArray(a).swap(*this);
}
return *this;
}
}
private
. При этом их не нужно определять.