C++笔记 | 第3课 类
文章目录
类(class)
类是将数据和相应对这些数据的操作函数进行封装,并设置访问权限。class
不同于struct
、union
,struct
、union
是纯数据类型,但不包括函数(操作)
类是对象的抽象,而对象是类的实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板 (模子)。
类可以继承和派生,并引出了访问权限控制和调整、保护成员、成员函数名静态和动态束定(虚函数)等一系列问题。
//类 举例
class Date
{
public:
//可以把成员函数直接在类说明中定义,这样成员函数若符合条件,将自动成为内联函数
void set(int d, int m, int y)
{
day=d; month=m; year = y; }
int isLeapYear()
{
return(year%4==0 && year%100!=0) || (year%400==0);}
void display()
{
cout <<month<< ":"<<day<< ":"<<year<<endl; }
private:
int day, month, year;
};
构造函数(constructor)和析构函数(destructor)
类建立后往往需要初始化。
构造函数是与类同名的成员函数。
没有定义构造函数编译器会自动生成一个构造函数(公有构造函数)。
与类同名带前缀~
的成员函数被称为是析构函数。
构造函数/析构函数不能在程序中显式地直接被调用,而是在对象创建和撤消时隐式地自动被调用。
构造函数可以多个同名(函数重载),以达到各种初始化的目的。
可以把构造函数改写成带缺省参数的函数:如Myclass(int i=0);
。
可以由缺省值构造函数代替转换构造函数
同名的构造函数必须在类的public
声明中逐个列出——如果想定义对象而不赋初值,必须再加一个无参构造函数。(用new
申请某一个类的动态对象数组时,在该类中必须能够匹配到没有形参的或缺省参数的构造函数)
构造函数/析构函数没有返回类型。
析构函数执行顺序与构造函数执行顺序相反,一一对应。
class Circle
{
public:
Circle(double x = 0, double y = 0, double r = 0) : x_(x), y_(y), r_(r) {
cout << "Circle(double, double, double) called\n"; }// :x_(x) 的写法效率高一些
~Circle() {
cout << "~Circle() called\n"; }
void xSetValue(double x) {
x_ = x; }
void ySetValue(double y) {
y_ =y; }
void rSetValue(double r) {
r_ = r; }
void display() const
{
cout << "O(" << x_ << ',' << y_ << ")" << '\t' << "radius=" << r_ <<endl;
}
void getArea() const
{
cout << "area=" << 3.14 * r_ * r_ <<endl;
}
private:
double x_;
double y_;
double r_;
};
内联构造函数
可以通过说明时把构造函数体直接放在类内,使之成为内联构造函数。符合内联函数的限制条件的类的构造函数体或成员函数体放在类内,该函数将自动成为内联函数. 目的:提高执行效率.
在类外可以通过在类的成员函数前加inline
,使之成为内联构造函数
//类中
public:
Myclass(int i=0);
// 类外函数定义
inline Myclass::Myclass(int i)
{
cout << "Constructor called. "<<i <<endl;
}
复制构造函数
复制(拷贝)构造函数是一种特殊的构造函数,其形参只有一个且是本类对象的引用。
作用是:使用一个已经存在的对象(由复制构造函数的参数指定),去构造并初始化同类的一个新对象。
class Point
{
public:
Point(int x = 0, int y = 0):x_(x),y_(y){
}
Point(Point &p):x_(p.x_)<