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__
这里定义了一个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 }
这里就将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 }
一般情况下,都建议使用初始化列表来进行初始化,变量的初始化分为两个过程,第一是初始化,第二是赋值。建议使用初始化列表的方式,其原因在于有些成员变量没有默认的构造函数,或者是const类型的成员。