explicit 只对构造函数起作用,用来抑制隐式转换。

class A
{
private:
	int a;
public:
	A(int x) :a(x){}
	void display(){ cout << a << endl; }
	void display()const{ cout << "ddd" << endl; }
};

void f(A a)//因为下面数据是常量,不能用&;因为用const就不能使用display
{
	a.display();
}
int main()
{
	A a(2),A  b(‘a‘);//隐式转换
	f(‘3‘);//隐式转换
	f(2);//影视转换
	A c = 13;//隐式转换
	a.display();
	b.display();
	c.display();
}

  

时间: 2024-11-05 21:38:05

explicit 只对构造函数起作用,用来抑制隐式转换。的相关文章

抑制隐式转换explicit

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //- } String s1 = "hello"; //OK 隐式转换,等价于String s1 = String("hello"); 但是有的时候可能会不需要这种隐式转换,如下: class String { String (

21.C++- ++操作符重载、隐式转换之explicit关键字、类的类型转换函数

++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 前置++操作符的返回值为*this 后置++操作符的返回值为临时对象 例如: 转换规则如下所示: 比如: 隐式转换的隐患 隐式转换有时会因为类型不同,得到的结果大有不同,也是常见bug之一. 参考以下示例: 运行打印: 答案并非是-1000. 同样,我们使用构造函数时,也经常使用隐式转换 参考以下示

effective c++条款13-17 “以对象管理资源”之C++隐式转换和转换构造函数

其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转换为整形1.然而对于用户自定义的类类型,编译系统并不知道如何进行转换,所以需要定义专门的函数来告诉编译系统改如何转换,这就是转换构造函数和类型转换函数! 注意:转换构造函数.隐式转换和函数对象不要搞混淆!!!函数对象是重载运算符(),和隐式转换函数易混淆. 一.转换构造函数 转换构造函数(conve

C++ explicit关键字避免隐式转换

explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: class things { public: things(const std::string &name = ""): m_name(name),height(0),weight(10){} int CompareTo(const things & other); std::string m_name

Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前在Windows下写程序的时候,基本上没有碰到这个关键字,那么这个关键字是做什么用的呢? 关键字 explicit 可以禁止“单参数构造函数”被用于自动类型转换,主要用于 "修饰 "构造函数. 指明构造函数只能显示使用,目的是为了防止不必要的隐式转化. 光看这一句似乎不太容易明白,下面,举

隐式转换构造函数、仿函数、转换函数实例

class B { public: //隐式转换 B(int i) { cout << i << endl; data = i; } //仿函数 bool operator() (int i) { cout << i << endl; return i > 0; } //转换函数 operator string() { return "class_string"; } private: int data; }; int main()

C++中显式、隐式与explicit关键字

在Qt的开发中看到explicit,由此展开搜索. 隐式:编译器完成的转换,如 int a = 1; float b = 3; float sum; sum = a + b; //a本是int,编译器将a隐式地转化为了float 显式:用户完成的转换,如 float a=1; float b=3; int s; s = (int)a+(int)b;//a与b被显式地转化为了float 对于函数而非数据,这里有另一个例子[引用]: #include <iostream> using namesp

c# implicit explicit关键字(隐式和显式数据类型转换)

implicit关键字用于声明隐式的用户定义类型转换运算符.(explicit反之)explicit则用于显示转换用户自定义类型.static implicit operator target_type ( source_type identifier ){......}隐式转换可以通过消除不必要的类型转换来提高源代码的可读性.但是,因为可以在未指定的情况下发生隐式转换,因此必须注意防止令人不愉快的后果. 一般情况下,隐式转换运算符应当从不引发异常并且从不丢失信息,以便可以在不知晓的情况下安全使

【C++】隐式类型转换和 explicit关键字

来自:黄邦勇帅 1. 当类中带有一个参数的构造函数时,将执形对象的隐式转换,比如有类 A,有一个带有一个参数的构造函数A(int i){}则当出现语句A m=1;就会调用带有一个参数的构造函数来创建对象m,也就是将语句转换为A m(1)的形式. 2. 如果有一个函数,比如 void f(A j){}这个函数需要一个类A 的对象作为参数,但是当调用语句为f(2)时,同样能调用这个函数,这时函数的形 参A j 被解释为,A j=2 即会隐式调用带有一个参数的构造函数来创建一个对象j. 但是有一种形式