如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制。将这种构造函数称为转换构造函数。
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED
#include<iostream>
usingnamespace std;
classClassTest
{
public:
ClassTest()
{
cout <<"ClassTest()"<<endl;
}
ClassTest(int i)
{
cout <<"ClassTest(int)"<<endl;
value = i;
value2 =2;
}
ClassTest(int i,int j): value(i), value2(j)
{
cout <<"ClassTest(int, int)"<<endl;
}
ClassTest(constClassTest& test)
{
cout <<"ClassTest(const ClassTest&)"<< endl;
value = test.value;
value2 = test.value2;
}
void getValue(int&,int&);
private:
int value =0;
int value2 =0;
};
#endif// MAIN_H_INCLUDED
#include"main.h"
voidClassTest::getValue(int&iValue,int&iValue2)
{
iValue = value;
iValue2 = value2;
}
int main()
{
ClassTest classTest =2;
/**
* 还可以使用以下几种实现方法
* ClassTest classTest(2);
* ClassTest classTest = ClassTest(2);
* ClassTest classTest = (ClassTest)2;
*/
int value =0;
int value2 =0;
classTest.getValue(value, value2);
cout <<"value = "<< value <<"\nvalue2 = "<< value2 << endl;
return0;
}
- 只允许一步类类型转换
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED
#include<iostream>
usingnamespace std;
classClassTest
{
public:
ClassTest()
{
cout <<"ClassTest()"<<endl;
}
ClassTest(string str)
{
strValue = str;
}
string getValue()
{
return strValue;
}
private:
string strValue;
};
#endif// MAIN_H_INCLUDED
#include"main.h"
int main()
{
ClassTest classTest = string("Hello world!");
//ClassTest classTest = "Hello world!";/*无法实现从char[]先转化为string,在由string转换为类类型*/
cout << classTest.getValue()<< endl;
return0;
}
- 抑制构造函数定义的隐式转换
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED
#include<iostream>
usingnamespace std;
classClassTest
{
public:
ClassTest()
{
cout <<"ClassTest()"<< endl;
}
/**
* 如果是在类声明之外进行类成员函数的实现,explicit只加在声明的位置
*/
ClassTest(string str)
{
strValue = str;
}
string getValue()
{
return strValue;
}
private:
string strValue;
};
#endif// MAIN_H_INCLUDED
#include"main.h"
int main()
{
//ClassTest classTest = string("Hello world!");/**< 错误 */
ClassTest classTest(string("hello world"));/**< 只能用于直接初始化 */
//ClassTest classTest = "Hello world!";/*无法实现从char[]先转化为string,在由string转换为类类型*/
cout << classTest.getValue()<< endl;
return0;
}
来自为知笔记(Wiz)