CSE 109 - Ashikur Rahman Sir Slides
CSE 109 - Ashikur Rahman Sir Slides
CSE 109 - Ashikur Rahman Sir Slides
A Rahman
From Representing a (Geometric) Vector
• In the context of geometry, a
vector consists of 2 points: a
start and a finish
To • Each point itself has an x and y
coordinate End =
(0.9, 1.5)
Start =
(0.4, 0.8)
CSE 109
1
11/1/2014
void printVector(double x0, double x1, double y0, double y1) { void printVector(double x0, double x1, double y0, double y1) {
cout << "(" << x0 << "," << y0 << ") -> (" cout << "(" << x0 << "," << y0 << ") -> ("
<< x1 << "," << y1 << ")" << endl; << x1 << "," << y1 << ")" << endl;
} }
class Vector {
Vector public:
double xStart;
double xEnd;
double yStart;
double yEnd;
xStart xEnd yStart yEnd
};
2
11/1/2014
MITStudent
class Vector { class MITStudent {
public: public:
double xStart; char *name; name studentID
double xEnd; int studentID;
double yStart; fields };
double yEnd;
};
name studentID
name studentID name studentID =? =?
=? =? =? =?
3
11/1/2014
4
11/1/2014
Vector
Start = Start =
(0.4, 0.8) (0.4, 0.8)
Start = x y Start =
(0.4, 0.8) (0.4, 0.8)
5
11/1/2014
Vector Vector
x y x y x y x y x y x y
class Vector { x=? y=? x=? y=? class Vector { x=3 y=? x=? y=?
public: public:
Point start, end; Point start, end;
}; };
6
11/1/2014
class Vector { x=3 y=4 x=5 y=6 class Vector { x=3 y=4 x=5 y=6
public: public:
Point start, end; Point start, end;
}; };
vec2 (instance of Vector)
int main() { int main() {
Vector vec1; Vector vec1; start (instance of Point) end (instance of Point)
vec1.start.x = 3.0; vec1.start.x = 3.0;
vec1.start.y = 4.0; vec1.start.y = 4.0; x=? y=? x=? y=?
vec1.end.x = 5.0; vec1.end.x = 5.0;
vec1.end.y = 6.0; vec1.end.y = 6.0;
} Vector vec2;
}
class Vector { x=3 y=4 x=5 y=6 class Vector { x=3 y=4 x=5 y=6
public: public:
Point start, end; Point start, end;
}; };
vec2 (instance of Vector) vec2 (instance of Vector)
int main() { int main() {
Vector vec1; start (instance of Point) end (instance of Point) Vector vec1; start (instance of Point) end (instance of Point)
vec1.start.x = 3.0; vec1.start.x = 3.0;
vec1.start.y = 4.0; x=3 y=4 x=? y=?
vec1.start.y = 4.0; x=7 y=4 x=? y=?
vec1.end.x = 5.0; vec1.end.x = 5.0;
vec1.end.y = 6.0; vec1.end.y = 6.0;
Vector vec2; Vector vec2;
vec2.start = vec1.start; vec2.start = vec1.start;
} vec2.start.x = 7.0;
}
• Assigning one instance to another copies all fields • Assigning one instance to another copies all fields
7
11/1/2014
void offsetPoint(Point p, double x, double y) { // does nothing void offsetPoint(Point &p, double x, double y) { // works
p.x += x; p.x += x;
p.y += y; p.y += y; Passed by
} } reference
class Point {
public: double x, y; Point class, with fields x and y
};
8
11/1/2014
int main() {
Vector vec; vec is an instance of Vector
}
9
11/1/2014
class Point {
};
public: double x, y; • Observe how some functions are closely
class Vector { associated with a particular class
public: Point start, end;
};
Pass classes by reference if they need to be modified
void offsetVector(Vector &v, double offsetX, double offsetY) {
v.start.x += offsetX;
v.end.x += offsetX;
v.start.y += offsetY; void offsetVector(Vector &v, double offsetX, double offsetY);
v.end.y += offsetY; void printVector(Vector v);
}
void printVector(Vector v) {
cout << "(" << v.start.x << "," << v.start.y << ") -> (" << v.end.x <<
"," << v.end.y << ")" << endl;
int main() {
} Vector vec;
vec.start.x = 1.2; vec.end.x = 2.0;
int main() { vec.start.y = 0.4; vec.end.y = 1.6;
Vector vec; offsetVector(vec,1.0, 1.5);
vec.start.x = 1.2; vec.end.x = 2.0; vec.start.y = 0.4; vec.end.y = 1.6; printVector(vec);
offsetVector(vec,1.0, 1.5); }
printVector(vec); // (2.2,1.9) -> (3.8,4.3)
}
10
11/1/2014
• Observe how some functions are closely • Observe how some functions are closely
associated with a particular class associated with a particular class
• Methods: functions which are part of a class • Methods: functions which are part of a class
- Implicitly pass the current instance
Object
Method name
instance
11
11/1/2014
Which box’s
button was Which button
pressed? was pressed?
void offset(double offsetX, double offsetY) { void offset(double offsetX, double offsetY) {
start.x += offsetX; start.x += offsetX;
end.x += offsetX; end.x += offsetX;
start.y += offsetY; methods start.y += offsetY; Fields can be accessed in a method
end.y += offsetY; end.y += offsetY;
} }
void print() { void print() {
cout << "(" << start.x << "," << start.y << ") -> (" << end.x << cout << "(" << start.x << "," << start.y << ") -> (" << end.x <<
"," << end.y << ")" << endl; "," << end.y << ")" << endl;
} }
}; };
12
11/1/2014
class Vector {
public:
Point start, end; Implementing Methods Separately
void offset(double offsetX, double offsetY) { • Recall that function prototypes allowed us to
start.offset(offsetX, offsetY);
end.offset(offsetX, offsetY);
declare that functions will be implemented later
methods of fields can be called
} • This can be done analogously for class methods
void print() {
start.print(); // vector.h - header file
cout << " -> "; class Point {
end.print(); public:
cout << endl; double x, y;
} void offset(double offsetX, double offsetY);
}; void print();
class Point {
public: };
double x, y;
void offset(double offsetX, double offsetY) { class Vector {
x += offsetX; y += offsetY; public:
} Point start, end;
void print() { void offset(double offsetX, double offsetY);
void print();
cout << "(" << x << "," << y << ")";
} };
};
#include "vector.h"
// vector.cpp - method implementation
void Point::offset(double offsetX, double offsetY) {
• Manually initializing your fields can get tedious
}
x += offsetX; y += offsetY; • Can we initialize them when we create an
void Point::print() { instance?
cout << "(" << x << "," << y << ")";
}
void Vector::offset(double offsetX, double offsetY) {
start.offset(offsetX, offsetY);
end.offset(offsetX, offsetY); Vector vec;
Point p;
} vec.start.x = 0.0; p.x = 0.0;
void Vector::print() { ͗͗ indicates which class’ method is being
vec.start.y = 0.0; p.y = 0.0;
start.print(); implemented
cout << " -> "; vec.end.x = 0.0;
end.print(); vec.end.y = 0.0;
cout << endl;
}
13
11/1/2014
Constructors Constructors
• Method that is called when an instance is created • Can accept parameters
class Point { class Point {
public: public:
double x, y; double x, y;
Point() { Point(double nx, double ny) {
x = 0.0; y = 0.0; cout << "Point instance created" << endl; x = nx; y = ny; cout << "2-parameter constructor" << endl;
} }
}; };
14
11/1/2014
• You can define your own copy constructor • Why make a copy constructor? Assigning all fields
(default copy constructor) may not be what you want
class Point {
public:
double x, y;
Point(double nx, double ny) {
x = nx; y = ny; cout << "2-parameter constructor" << endl;
}
Point(Point &o) { class MITStudent {
x = o.x; y = o.y; cout << "custom copy constructor" << endl; public:
} int studentID; int main() {
}; char *name; MITStudent student1;
MITStudent() { student1.studentID = 98;
int main() {
Point q(1.0, 2.0); // 2-parameter constructor studentID = 0; char n[] = "foo";
Point r = q; // custom copy constructor name = ""; student1.name = n;
// r.x is 1, r.y is 2 } MITStudent student2 = student1;
} }; student2.name[0] = 'b';
cout << student1.name; // boo
}
By changing student 2’s name, we
changed student 1’s name as well
15
11/1/2014
16
11/1/2014
Equivalent Equivalent
class Point { struct Point { to to
public:
double x; double x;
double y; double y; struct Point { class Point {
}; }; public: private:
double x, y; double x, y;
}; };
17