构造函数
c++在定义一个类的时候会默认生成6个函数,构造函数是其中一个。
构造函数的作用
构造函数的作用不是构造一个对象,其作用是初始化对象。构造函数理解为初始化函数其实更为妥当。
构造函数的语法
- 构造函数没有返回值,也不写void,是特殊的成员函数
- 构造函数的函数名必须与类名一样
- 构造函数可以发生重载
- 构造函数在创建一个对象的时候会被自动调用
class Student {
private:
int _age;
double _score;
public:
Student() { //构造函数的写法
this->_age = 18;
this->_score = 95.5;
}
Student(int age, double score) { //重载的构造函数
this->_age = age;
this->_score = score;
}
};
int main() {
Student s;
Student t(20, 85.5);
return 0;
}
构造函数是一种特殊的成员函数,也存在this指针
默认构造函数
不用传递参数编译器就能调用的构造函数称之为默认构造函数。
默认构造函数有三种:
-
自己什么都不写,系统默认提供的空实现的构造函数
class Person { private: int _age; }; int main(){ Person p; return 0; }
使用Person实例化对象p的时候,实际上是调用了Person类的编译器空实现的构造函数
构造函数的任务是对对象进行初始化,编译器提供的空实现的构造函数与自己写的普通的构造函数不同。默认提供的构造函数不对内置类型(基本类型)进行初始化,对于自定义类型,会调用自定义类型的默认构造函数。
基本类型(内置类型):
int double char long float 指针
自定义类型:
struct,class
class Stack { private: int* _a; int _capacity; int _top; public: Stack() { _capacity = 4; _top = 0; _a = (int*)malloc(sizeof(int) * _capacity); } }; class Queue { private: Stack s1; Stack s2; int t; }; int main() { Queue q; return 0; }
使用Queue实例化对象q的时候,对于q中定义的内置类型t,没有做初始化的工作,而q中的自定义类型s1和s2,调用了它们的默认构造函数进行了初始化的工作。c++中的编译器提供的默认构造函数不能对内置类型进行初始化,所以c++11提供了一个补丁解决这一问题。在c++11标准中,上面的Queue可以这样写
class Queue { private: Stack s1; Stack s2; int t = 0;//这里仍然是变量的声明,不是定义,没有开辟空间。只是给了内置数据类型的成员一个缺省值 };
-
自己提供的无参构造函数
class Queue { public: Queue() { t = 20; } private: Stack s1; Stack s2; int t; };
这里在使用Queue实例化对象的时候,对于自定义类型,也会调用它的默认构造函数
-
全缺省的构造函数
class Queue { public: Queue(int t=1,int r=2,int y=3) { _t = t; _r = r; _y = y; } private: Stack s1; Stack s2; int _t; int _r; int _y; };
这里在调用全缺省的默认构造函数时,对于Queue中的自定义类型的成员变量,也会调用它的默认构造函数
有参构造函数
class Stack {
private:
int* _a;
int _capacity;
int _top;
public:
Stack(int capacity) {
_top = 0;
_a = (int*)malloc(sizeof(int) * _capacity);
}
};
当我们只写了一个有参构造函数时,编译器就不会提供默认构造函数,此时要想创建对象,必须传入参数.