构造函数
一、普通构造函数
构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数的名字必须与类名相同,而不能由用户任意命名。它可以有任意类型的参数,但不能具有返回值。它不需要用户来调用,而是在建立对象时自动执行。
class score {
public:
score(int m, int f); /* 构造函数 */
void setScore(int m, int f);
//inline void showScore();
private:
int mid_exam;
int fin_exam;
};
/* 构造函数 */
score::score(int m, int f) {
mid_exam = m;
fin_exam = f;
}
/* 普通成员函数的定义 */
void score::setScore(int m, int f) {
mid_exam = m;
fin_exam = f;
}
在建立对象的同时,采用构造函数给数据成员赋值,通常由以下两种形式
1.类名 对象名[(实参表)]
score opt2(10, 20);
opt2.showScore();
2.类名 *指针变量名 = new 类名[(实参表)]
opt1 = new score(66, 66);
opt1->setScore(54, 199);
opt1->showScore();
特点:
1,构造函数没有返回值,也不需要写 void
2,构造函数的名字一定要和类名相同
与普通的成员函数一样,构造函数的函数体可以写在类体内,也可写在类体外。
3,构造函数和普通函数一样,可以没有参数,也可以有参数(一个或多个)构造函数
可以进行重载
4,构造函数无需程序员手动调用,由编译器自动调用
什么时候调用?创建对象的时候自动调用
注意:
创建对象的时候,会根据你的创建语法去匹配对应的构造函数:
类名 对象名; -> 调用无参构造函数
类名 对象名(参数); ->调用有参构造函数
类名 对象名(); //error,编译器会认为这是声明了一个函数
c++11标准(新标准)统一了两种写法:
类名 对象名{}; -> 调用无参构造函数
类名 对象名{参数}; ->调用有参构造函数
当你创建/构造对象的时候,如果没有与参数列表相匹配的构造函数,就会报错 ->构造失败
二、成员初始化列表
类名::构造函数名([参数表])[:(成员初始化列表)]
{
//构造函数体
}
构造函数初始化列表是对构造函数的一种增强,它能够初始化一些特殊的成员
如:
对象成员 -》指定调用该对象的某个构造函数
常量成员 -》被 const修饰的成员变量
引用成员
基类成员
class A{
private:
int x;
int& rx;
const double pi;
public:
A(int v) : x(v), rx(x), pi(3.14) //成员初始化列表
{ }
void print()
{
cout << "x = " << x << " rx = " << rx << " pi = " << pi << endl;
}
};
思考1:B类中有一个A类对象成员,在创建B类对象时,会先调用A类的构造函数,如果A类有多个构造函数,会默认调用哪个???
-> 默认调用无参构造函数
思考2:如果A类没有无参构造函数/就是想调用A类的有参构造函数,程序员自己指定调用A类的某个构造函数
->构造函数初始化列表
/* 圆心类 */
class circelPos {
public:
circelPos(int x, int y);
void setPos(int x, int y);
int getX() const;
int getY() const;
private:
int x;
int y;
};
/* 圆类 */
class Circel {
public:
Circel(int x1, int y1, int r1, int color1);
int getR() const;
const circelPos *getPos() const;
int getColor() const;
void check() const;
private:
int r;
int color;
circelPos pos;
};
circelPos::circelPos(int x, int y) {
this->x = x;
this->y = y;
}
/* 如果圆心类有多个构造函数,可以指定圆类调用哪个构造函数 */
Circel::Circel(int x, int y, int r1, int color1) : pos{x, y}, r(r1), color(color1) {
cout << "构造函数使用中" << endl;
}
析构函数
析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤销对象时的一些清理任务,如释放分配给对象的内存空间等。
析构函数语法:
~函数名() {
.....
}
特点:
1,析构函数没有返回值,也不需要写void
2,函数名 : ~类名
3,不能有参数
4,不需要程序员手动调用,由编译器自动调用
什么时候自动调用? 对象被销毁的时候(生存期到了)
如果没有自己实现,也会默认生成一个
score::score(int data1) : PI{3.14} {
cout << "score()无参构造函数" << endl;
data = data1;
}
/*
score::score(int data1) {
cout << "score()有参构造函数" << endl;
data = data1;
}
*/
score::~score() {
cout << "score()析构函数" << endl;
}