加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++ 类的构造函数

发布时间:2020-12-16 09:11:54 所属栏目:百科 来源:网络整理
导读:在 上一章 中,初步的介绍了 类的部分内容, 必须熟练掌握 类? 部分内容与结构体相同 好了,当我们创建一个类时,有的时候 需要初始化,这时候就需用到构造函数 构造函数的格式为: ? ClassType(List ){ // Do something... } ? ClassType 为类的名字 List 为参数

上一章中,初步的介绍了类的部分内容,必须熟练掌握

类?部分内容与结构体相同

好了,当我们创建一个类时,有的时候需要初始化,这时候就需用到构造函数

构造函数的格式为:

?

<ClassType>(<List>)
{
        //Do something...
}

?

<ClassType> 为类的名字

<List> 为参数列表

?

在类创建的时候,都会调用构造函数

但是有的时候不写自己的构造函数的话,系统会调用默认的构造函数 (也就是什么都不做)

但是当写了构造函数后,系统就不会调用默认的构造函数

?

构造函数的声明必须写在类中,但是实现可以写在外头 (如果不知道如何将成员函数外部实现的看这里):

 1 class Student
 2 {
 3     string name;
 4     public:
 5         Student(string)
 6 };
 7 Student::Student(string name)
 8 {
 9     this->name=name;//这里可以直接访问类的成员
10 }

备注: 在第9行用到了 this 指针,不明白的看这里

?

?

这样一来,在声明类的时候,可以调用构造函数,其格式为:

<ClassType> 变量名(<List>)

?

<List> 指该类的构造函数的参数列表

构造函数必须这样写,不得写在声明后的其余地方

?

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Student
 5 {
 6     string name;
 7     public:
 8         Student(string);
 9         string GetName();
10 };
11 Student::Student(string name)
12 {
13     this->name=name;
14 }
15 string Student::GetName()
16 {
17     return name;
18 }
19 int main()
20 {
21     Student s;
22     s.Student("TweeChalice");//Error!!!
23     cout<<s.GetName()<<endl;
24 }

?

必须写成这样:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Student
 5 {
 6     string name;
 7     public:
 8         Student(string);
 9         string GetName();
10 };
11 Student::Student(string name)
12 {
13     this->name=name;
14 }
15 string Student::GetName()
16 {
17     return name;
18 }
19 int main()
20 {
21     Student s("TweeChalice");
22     cout<<s.GetName()<<endl;
23 }

?

现在又有一个问题了,如果我没有使用任何构造函数怎么办,如:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Student
 5 {
 6     string name;
 7     public:
 8         Student(string);
 9         string GetName();
10 };
11 Student::Student(string name)
12 {
13     this->name=name;
14 }
15 string Student::GetName()
16 {
17     return name;
18 }
19 int main()
20 {
21     Student s;//Error!!!
22     cout<<s.GetName()<<endl;
23 }

报错:

[Error] no matching function for call to Student::Student()

也就是说,变量 s 的构造函数已经不存在了,那么就不符合类的声明规则 (看上文),自然就会报错

那怎么办? ----- 自己写出系统默认的构造函数

?

先认识一下该关键字:

default

这个大家肯定很熟悉,但是很少用在除了 switch 语句中的其他地方

我们只需要显示出系统默认的构造函数:

?

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Student
 5 {
 6     string name;
 7     public:
 8         Student()=default;//Do nothing...  9         Student(string);
10         string GetName();
11 };
12 Student::Student(string name)
13 {
14     this->name=name;
15 }
16 string Student::GetName()
17 {
18     return name;
19 }
20 int main()
21 {
22     Student s;
23     cout<<s.GetName()<<endl;
24 }

?

这下就正常运行了... (然而结果是什么都没有,因为 name 根本没有被赋值)

?

有的时候还需要多重的构造函数,如:

 1 class Student
 2 {
 3     int ID;
 4     string name;
 5     public:
 6         Student(int);//Set student ID
 7         Student(string);//Set student name
 8         int GetID();
 9         string GetName();
10 };
11 Student::Student(int ID)
12 {
13     this->ID=ID;
14 }
15 Student::Student(string name)
16 {
17     this->name=name;
18 }
19 string Student::GetName()
20 {
21     return name;
22 }
23 int Student::GetID()
24 {
25     return ID;
26 }

这时候构造时,系统会根据给出的数据自动选择适合的构造函数:

?

#include <iostream>
#include <string>
using namespace std;
class Student
{
    int ID;
    string name;
    public:
        Student(int);
        Student(string);
        int GetID();
        string GetName();
};
Student::Student(int ID)
{
    this->ID=ID;
}
Student::Student(string name)
{
    this->name=name;
}
string Student::GetName()
{
    return name;
}
int Student::GetID()
{
    return ID;
}
int main()
{
    Student s(8);//Set student ID
    cout<<s.GetID();
    return 0;
}

?

或:

#include <iostream>
#include <string>
using namespace std;
class Student
{
    int ID;
    string name;
    public:
        Student(int);
        Student(string);
        int GetID();
        string GetName();
};
Student::Student(int ID)
{
    this->ID=ID;
}
Student::Student(string name)
{
    this->name=name;
}
string Student::GetName()
{
    return name;
}
int Student::GetID()
{
    return ID;
}
int main()
{
    Student s("TweeChalice");
    cout<<s.GetName();
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读