您的位置:首页 > 编程语言 > C语言/C++

C++中的explicit关键字

2016-03-27 00:01 387 查看
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

explicit使用注意事项:

explicit 关键字只能用于类内部的构造函数声明上。

explicit 关键字作用于单个参数的构造函数。

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换


#include <iostream>

//在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,
//不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

class Circle
{
public:
explicit Circle(double r):R(r)
{
printf("double r.......\n");
}

explicit Circle(int x ,int y = 0):X(x),Y(y)
{
printf("int x ,int y = 0.......\n");
}
// 拷贝构造函数
explicit Circle(const Circle &c):R(c.R),X(c.X),Y(c.Y)
{
printf("const Circle &c.......\n");
}

~Circle()
{
printf("release...\n");
}

private:
double R;
int X ;
int Y;
};

//未加
void main1()
{
//发生隐式类型转换
//编译器会将它变成如下代码
//tmp = Circle(1.23)
//Circle A(tmp);
//tmp.~Circle();
//Circle A = 1.23;

//注意是int型的,调用的是Circle(int x, int y = 0)
//它虽然有2个参数,但后一个有默认值,仍然能发生隐式转换
/*Circle B = 123;*/
//Circle B=123;

//这个算隐式调用了拷贝构造函数
//Circle C = A;

system("pause");
}

void main()
{
//一下3句,都会报错
/*Circle A = 1.23;
Circle B = 123;
Circle C = A;*/

//只能用显示的方式调用了
//未给拷贝构造函数加explicit之前可以这样
//Circle A = Circle(1.23);
//Circle B = Circle(123);
//Circle C = A;

//给拷贝构造函数加了explicit后只能这样了
Circle A(1.23);
Circle B(123);
Circle C(A);

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  explicit