类成员函数
先了解好类的一些基础知识
大纲:
1. 类的构造函数与析构函数
1. 对象的初始化
2. 对象的销毁
在开始写之前
我们先来尝试实现一个矢量类
二维的矢量由两个变量决定
我们先来用x,y 表示
然后该矢量还应该有这样的成员函数
show(),
用于查看这个矢量的坐标值
还有矢量的标量乘法
我们用
multiple(int)
还有很多其他的以后再实现
(运算符重载以后再写)
//由于比较短小,暂时不分文件
#include <iostream>
class Vector
{
private:
int x;
int y;
public:
void show();
void multiple(int);
};
void Vector::show()
{
using namespace std;
cout << x << "," << y << endl;
return ;
}
void Vector::multiple(int m)
{
x *= m;
y *= m;
return ;
}
构造函数与析构函数
构造函数
在声明对象的时候
(如声明一个v的Vector对象)
Vector v;
就会自动调用构造函数进行初始化析构函数
在对象过期或程序结束销毁变量的时候
就会自动调用析构函数来销毁对象
有问题了
一开始自己写类的时候都不知道构造函数和析构函数是什么鬼
为什么程序也能正常运行,正常初始化,正常销毁
在用户没有自定义构造函数和析构函数的前提下
类会自动生成默认构造函数和默认析构函数
构造函数(constructor)
原型:
函数名与类名相同
形参列表自己定义
会返回一个对象,不过不用在函数中写出
如Vector类的构造函数可以这样定义
Vector(){};
这个函数不需要输入数据,也不进行任何操作
实际上这个就是默认构造函数
在不声明任何析构函数的情况下会自动声明默认析构函数
在自定义了析构函数之后就不会再自动声明默认析构函数
析构函数可以重载
析构函数(destructor)
原型:
函数名是在类名前加上~;
不接受任何参数,也不返回任何值
如Vector类的析构函数可以这样定义
~Vector(){};
不做任何事情的它,实际上
就是Vector类的默认析构函数
在不声明任何构造函数的情况下会自动声明默认构造函数
在自定义了构造函数之后就不会再自动声明默认构造函数
构造函数可以重载
如何初始化类
先弄明白在声明对象的时候
会怎样调用构造函数
之前的
Vector v;
声明一个名字为v的Vector变量
实际上等同于这样
Vector v()
它调用了Vector类的默认构造函数
Vector();
因此它什么也不做,里面的所有变量也没有初始化
那我自己定义一个构造函数
//函数在类中的原型
Vector(int , int);
//函数定义
//注意在类的外部,需要用作用域解析运算符访问类的内部
Vector::Vector(int a, int b)
{
x = a;
y = b;
}
当有了这个构造函数之后
我们就可以这样
Vector v(2,3);
这样,在初始化的时候就会自动调用我自己定义的构造函数
然后就能够把v对象中的x和y初始化
总结
对象的初始化方式
注意含有花括号的为c++11中的列表初始化
// 调用默认构造函数 Vector v; Vector v(); Vector v{}; Vector v = {}; //调用自己的构造函数 Vector v(2,3); Vector v {2,3}; Vector v = {2,3}
如果用new的话,还可以这样
Vector *pv = new Vector;
Vector *pv = new Vector();
Vector *pv = new Vector(2,3);
Vector *pv = new Vector{2,3};
对象的销毁
每生成一个对象,一定需要对应着一个销毁的过程
默认的析构函数
虽然语句什么都没有
~Vector() {};
但是析构函数会执行释放对象里的成员的操作
情况1
声明局部对象
在离开代码块后,自动执行析构函数
情况2
new了一个对象
Vector *pv = new Vector
在我delete的时候
delete pv;
就会自动调用析构函数来释放对象
情况3
程序结束后
自动调用析构函数来释放对象
总结
- 构造函数和析构函数的原型要记住
- 掌握构造函数和析构函数的调用时期
- 类的各种初始化
- new一个对象时的初始化方式
然后我们的Vector类变成了这样
//由于比较短小,暂时不分文件
#include <iostream>
class Vector
{
private:
int x;
int y;
public:
Vector() {};//默认构造函数
Vector(int a, int b);//自定义构造函数
~Vector(){};//析构函数
void show();
void multiple(int);
};
Vector::Vector(int a, int b)
{
x = a;
y = b;
}
void Vector::show()
{
using namespace std;
cout << x << "," << y << endl;
return ;
}
void Vector::multiple(int m)
{
x *= m;
y *= m;
return ;
}
提醒一下:
声明对象的时候当然可以声明对象数组
Vector array[10];
但是,声明对象数组有个前提
该对象必须有默认构造函数
原因:
Vector array[2] = {{2,3},{3,4}};
在初始化对象数组的时候,首先使用默认构造函数创建数组元素
然后花括号中的构造函数讲创建临时变量,然后将临时对象的内容复制到相应的成员
调用默认构造函数的过程是无法避免的