构造函数,析构函数

构造函数(Constructor)是一种特殊的成员函数,1:它的名字和类名相同,没有返回值,2:不需要用户调用(用户也不能调用),而是在创建对象时自动执行。3:构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值。

从某个网站偷来的,我觉得很经典

#include <iostream>
using namespace std;

class Student{
private:
    char *name;
    int age;
    float score;

public:
    //声明构造函数
    Student(char *, int, float);
    //声明普通成员函数
    void say();
};

//定义构造函数
Student::Student(char *name1, int age1, float score1){
    name = name1;
    age = age1;
    score = score1;
}
//定义普通成员函数
void Student::say(){
    cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}

int main(){
    //根据构造函数创建对象
    Student stu("小明", 15, 90.5f);  //传参形式类似于函数调用
    stu.say();

    return 0;
}
运行结果:
小明的年龄是 15,成绩是 90.5


在类中我们定义了一个构造函数 Student(),它的作用是给3个 private 属性的成员变量赋值。在 main 函数中,我们根据构造函数创建了一个对象 stu;因为构造函数有参数,所以创建对象时要相应地传入实参,形式类似于函数调用。

读者要注意:一旦在类中定义了构造函数,那么创建对象时一定会被执行;如果构造函数有参数,创建对象时就要传参。

另外,构造函数主要用来进行初始化,没有返回值(有返回值没有任何意义),这就意味着:

  • 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
  • 函数体中不能有 return 语句。

默认构造函数

如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行任何操作。比如上面的 Student 类,默认生成的构造函数如下:
Student(){}
一个类,必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管它是 public 属性的,还是 private、protected 属性的,编译器都不再自动生成。上面的 Student 类,只有一个构造函数,就是我们自己定义的。
实际上,编译器只有在必要的时候才会生成默认构造函数,而且它的函数体一般不为空。默认构造函数的目的是帮助编译器做初始化工作,而不是帮助程序员。这是C++的内部实现机制,

构造函数的重载

和普通成员函数一样,构造函数是允许重载的。一个类可以提供多个构造函数,让用户在创建对象时进行选择,编译器会根据创建对象时传递的参数来确定调用哪一个构造函数。也就是说:
  • 只有一个构造函数会被执行;
  • 创建对象时提供的参数必须和其中的一个构造函数匹配,否则编译错误。

#include <iostream>
using namespace std;

class Student{
private:
    char *name;
    int age;
    float score;

public:
    //声明构造函数
    Student();
    Student(char *, int, float);
    //声明普通成员函数
    void setname(char *);
    void setage(int);
    void setscore(float);
    void say();
};

//定义构造函数
Student::Student(){}
Student::Student(char *name1, int age1, float score1){
    name = name1;
    age = age1;
    score = score1;
}
//定义普通成员函数
void Student::setname(char *name1){
    name = name1;
}
void Student::setage(int age1){
    age = age1;
}
void Student::setscore(float score1){
    score = score1;
}
void Student::say(){
    cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}

int main(){
    //创建对象时初始化成员变量
    Student stu1("小明", 15, 90.5f);
    stu1.say();
   
    //调用成员函数来初始化成员变量的值
    Student stu2;
    stu2.setname("李磊");
    stu2.setage(16);
    stu2.setscore(95);
    stu2.say();

    return 0;
}
运行结果:
小明的年龄是 15,成绩是 90.5
李磊的年龄是 16,成绩是 95

类中定义了两个构造函数,一个带参数一个不带参数,它们是重载关系。当根据不带参数的构造函数创建对象时,不需要传参,成员变量不会被初始化,所以要调用成员函数来设置它们的值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值