c++ 构造函数以及explicit 关键字的使用

关于构造函数中的隐式转换:

在一个类所定义的构造函数中,存在如下的用法:

 1 #pragma once
 2 #ifndef __EXERCISE__
 3 #define __EXERCISE__
 4 
 5 #include <string>
 6 
 7 class Sale_Item
 8 {
 9 public:
10     Sale_Item(const std::string&);
11     Sale_Item(std::istream&);
12     Sale_Item();
13     void print();
14     bool isSame(Sale_Item);
15     static int total;
16 private:
17     std::string number;
18 };
19 
20 #endif // !__EXERCISE__
View Code

 

这里定义了一个Sales_Item类,其中构造函数可以传入iostream或者是string对象。还有一个成员函数是传入一个Sales_Item对象来作为两个Sales_Item对象的比较。那么我们在调用isSame(Sales_Item) 方法时,其实是可以传入一个string对象来进行实现的。

因为这里会默认进行类型转换,转换的方式就是将这个实参字符串通过构造函数(传入string对象的构造函数) 转换成Sales_Item对象。见如下代码使用:

 1 // ConsoleApplication18.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "Exercise.h"
 6 #include <iostream>
 7 
 8 using namespace std;
 9 
10 Sale_Item::Sale_Item()
11 {
12     number = "default";
13     ++total;
14 }
15 
16 Sale_Item::Sale_Item(const string &str)
17 {
18     number = str;
19     ++total;
20 }
21 
22 Sale_Item::Sale_Item(istream &is)
23 {
24     is >> number;
25     ++total;
26 }
27 
28 void Sale_Item::print()
29 {
30     cout << number << endl;
31 }
32 
33 bool Sale_Item::isSame(Sale_Item item)
34 {
35     return this->number == item.number;
36 }
37 int Sale_Item::total = 0;
38 
39 int main()
40 {
41     Sale_Item temp("001");
42     temp.print();
43     string number = "001";
44     cout << temp.isSame(number) << endl;
45     cout << "the number of object is : " << temp.total << endl;
46     system("PAUSE");
47     return 0;
48 }
View Code

 

这里就将isSame的参数进行隐式转换了。

如果不想这种隐式转换自动进行,那么可以将这个传入string对象的构造函数声明为explicit 。

 

static 字段说明:

还有一种要记录,就是关于static 字段的说明。static 成员是类的成员,不仅仅要进行声明,而且在定义该类的cpp文件中还要进行一次初始化,还是上面的代码,cpp 文件中初始化了total变量,这里我使用total变量的作用是统计一共产生了多少个Sales_Item对象。

 

类的声明中包含该类的数据成员:

在一个类,如果需要定义一个该类类型的字段,那么这个字段必须是指针或者引用。因为这个时候,类的定义是不完整的。

 

关于构造函数的初始化列表:

一般情况下,建议使用构造函数初始化列表的方式来初始化成员变量。Sales_Item构造函数可以做如下修改:

1 Sale_Item::Sale_Item(const string &str) :number(str)
2 {
3     ++total;
4 }
View Code

 

一般情况下,都建议使用初始化列表来进行初始化,变量的初始化分为两个过程,第一是初始化,第二是赋值。建议使用初始化列表的方式,其原因在于有些成员变量没有默认的构造函数,或者是const类型的成员。

 

posted on 2017-03-12 15:11  ^~~^  阅读(1157)  评论(0编辑  收藏  举报

导航