Step in Object-Oriented👀
约 945 个字 161 行代码 预计阅读时间 5 分钟
Objects = Attributes + Services
- 首先将 struct 改为 class (struct 是指内部成员统统对外开放的, class 是默认外部不可访问的)
对外与对内相对应,对内指可以在 struct 中或者成员函数中使用
Example
···
class Point{
float x;
float y;
public:
void init(int ix, int iy)
{
x = ix;
y = iy;
}
void print()
{
cout << x << " , " << y << endl;
}
void move(int dx, int dy);
} ;
void Point::move(int dx, int dy) //struct 中不带 body ,所以需要另给出 body
{
x += dx;
y += dy;
}
int main()
{
Point a, b;
a.init(1, 1);
b.init(1, 1);
a.x = b.x = 1; // --+
a.y = b.y = 1; // --+-- Error: 不可访问
a.move(2, 2);
a.print();
b.print();
}
Constructor👀
- Guaranteed initialization with the constructor
- If a class has a constructor, the compiler automatically calls that constructor at the point an object is created, before client programmers can get their hands on the object.
- The name of the constructor is the same as the name of the class
class
中的构造函数,函数名和类的名字一致 (无返回类型)
-
Constructors with arguments
- The constructor can have arguments to allow you to specify how an object is created, give it initialization values, and so on.
- 当同名成员函数存在参数时,用类构造对象的时候要主动给出相应的值, 如
Point a(1, 1);
Point *p = new Point(5, 6);
——>new
做了两件事- 申请空间
- 调用 Point 的构造函数,把 5 和 6 传递给构造函数 (但构造函数执行的时候这个对象已经存在了,构造函数做的事情是初始化)
构造函数不做内存分配
Example
··· class Point{ private: float x; float y; public: Point(int x, int y); //名字和类的名字一样,且无返回类型 void print(); void move(int dx, int dy); }; Point::Point(int x, int y) { this->x = x; this->y = y; } void Point::print() { ··· } void Point::move(int dx, int dy) { ··· } int main() { Point a(1, 2), b(3, 4); ··· } ···
-
函数的重载 —— 在 class 中有多个同名的成员函数 (但需要保证参数表不同)
Example
··· class Point{ private: float x; float y; public: Point(int deep); Point(int x, int y); void print(); void move(int dx, int dy); }; Point::Point(int deep) { x = y = deep; } ··· int main() { ··· Point c(10); //会调用参数为 deep 的成员函数 ··· } ···
Point c(10);
等价于Point c=10;
(单个赋值都可以用圆括号或等号)- 由于存在构造函数,此时 (即使 float x 和 float y 都是 public) 不再支持 结构那样的方式初始化 (
Point a = {1, 1};
)
-
The default constructor
- A default constructor is one that can be called with no arguments
- 指的是写了一个构造函数,这个构造函数没有参数
- 如果未给出构造函数,编译器会给出一个什么都不做的构造函数来通过编译
The destructor👀
- In C++, cleanuo is as important as initialization and is therefore guaranteed with the destructor
-
The destructor is named after the name of the class with a leading tidle (~). The destructor never has any arguments.
- The destructor is called automatically by the compiler when the objects goes out of scope.
- The only evidence for a destructor call is the closing brace of the scope that surrounds the object.
- 如下,析构函数
~Y();
会在对象的空间被回收之前被自动调用.
Example
··· class Point{ private: float x; float y; public: Point(int deep); Point(int x, int y); Point(){x = 31, y = 17;} ~Point() { cout << "~"; print(); } void print(); ··· } ··· int main() { Point a(1, 2), b(3, 4); Point *p = new Point(5, 6); Point c(10); Point d; d.print(); delete p; }
- 因为所有变量定义在 main 中,当发生到
delete
时本地变量生存期结束,即所有变量都要析构 (析构的顺序时构造的逆序) - 如果 main 中修改如下
int main() { Point a(1, 2), b(3, 4); Point *p = new Point(5, 6); { Point c(10); } Point d; d.print(); delete p; }
- 因为 c 出了括号就结束了,所以先被析构
Global objects
- Consider
- Constructors are called before entering
main()
- Order controlled by appearance in file
- In this case,
global_x1
beforeglobal_x2
main()
is no longer the first function called
- Destructors called when
main()
exitsexit()
is called
Storage allocation👀
- The compiler allocates all the storage for a scope at the opening brace of that scope
- The constructor call doesn’t happen until the sequence point where the object is defined
Initialization👀
Initializer list👀
code
Point(float xa = 0.0, float ya = 0.0): x(xa), y(ya){}
中: x(xa), y(ya)
即初始化列表形式
- Can initialize any type of data
- pseduo-constructor calls for built-in types
- No need to perform assignment within body of constructor
- Order of initialization is order of declaration
- Not the order in Initializer list!
- Destoryed in reverse order of declaration
- 比如即便在 Initializer list 中
Point(float xa = 0.0, float ya = 0.0): y(ya), x(xa){}
,ya
在xa
之前声明,但是由于成员变量声明x
在y
之前,所以x
会先被初始化 Point(float xa = 0.0, float ya = 0.0): y(ya), x(y){}
就不会符合x = y = ya
Others👀
编程规范
- Declarations vs. Definitions
- cpp file —— compile unit
- Only declarations are allowed to be in .h (). Declarations are as follows:
- extern variables
- function prototypes
- class/struct declaration
- inline function
- Others are Definitions
-
- All .h files should look like this:
Standard header file structure
-
Tips for header
- One class declaration per header file
- Associated with one source file in the same prefix of file name
- The contents of a header file is surrounded with
#ifdef #define #endif
本文总阅读量:
次