c++中的构造函数


构造函数

c++在定义一个类的时候会默认生成6个函数,构造函数是其中一个。

构造函数的作用

构造函数的作用不是构造一个对象,其作用是初始化对象。构造函数理解为初始化函数其实更为妥当。

构造函数的语法

  1. 构造函数没有返回值,也不写void,是特殊的成员函数
  2. 构造函数的函数名必须与类名一样
  3. 构造函数可以发生重载
  4. 构造函数在创建一个对象的时候会被自动调用
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指针

默认构造函数

不用传递参数编译器就能调用的构造函数称之为默认构造函数。

默认构造函数有三种:

  1. 自己什么都不写,系统默认提供的空实现的构造函数

    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;//这里仍然是变量的声明,不是定义,没有开辟空间。只是给了内置数据类型的成员一个缺省值
    };
    
  2. 自己提供的无参构造函数

    class Queue {
    public:
    	Queue() {
    		t = 20;
    	}
    private:
    	Stack s1;
    	Stack s2;
    	int t;
    };
    

    这里在使用Queue实例化对象的时候,对于自定义类型,也会调用它的默认构造函数

  3. 全缺省的构造函数

    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);
	}
};

当我们只写了一个有参构造函数时,编译器就不会提供默认构造函数,此时要想创建对象,必须传入参数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值