码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 类的构造函数

时间:2019-09-28 14:38:10      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:err   函数的参数   ++   htm   names   变量   list   call   code   

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

类 部分内容与结构体相同

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

构造函数的格式为:

 

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

 

C++ 类的构造函数

标签:err   函数的参数   ++   htm   names   变量   list   call   code   

原文地址:https://www.cnblogs.com/tweechalice/p/11602530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!