目录什么是隐式转换:为什么要进行隐式转换:隐式转换的原则:目标代码构造函数定义的隐式类型转换分析a1分析a2分析a3什么是隐式转换: c++中的基本类型并非完全对立,部分类型之间是可
c++中的基本类型并非完全对立,部分类型之间是可以进行隐式转换的,所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为,很多时候用户都不知道具体进行了哪些转换
隐式转换可以让程序员在两个不同类型的数据直接进行操作,而不用自行转换类型,隐式转换给程序开发者带来了不小的便捷
旨在弄懂下面的代码,明确变量a1,a2,a3在创建时编译器究竟干了那些事:
#include<iOStream>
using namespace std;
class A{
public:
int x;
A() {cout<<"A()"<<endl;}
A(int i) : x(i){cout<<"A(int i)"<<endl;}
A(const A &ra) : x(ra.x)
{cout<<"A(const A&)"<<endl;}
void operator=(const A&){cout<<"operator="<<endl;}
};
int main(){
cout<<"the assignment of a1 : "<<endl;
A a1;
a1 = 2;
cout<<"the copy initialization of a2 : "<<endl;
A a2 = 2;
cout<<"the direct initialization of a3 :"<<endl;
A a3(a1);
return 0;
}
运行结果:
任何只接受一个参数的构造函数,都隐式地定义了由该参数向该类型的隐式类型转换
如A(int i)
定义了一个由int向A的隐式类型转换
所以,在任何使用A对象的地方,可以用一个int代替,此时,int会转换为一个A类型临时变量
如对a1变量的赋值操作:
A a1; //声明a1,a1被默认初始化
a1 = 2; //2转换为A类型的临时变量,对a1进行赋值操作
对于隐式类型转换,需要注意两点:
隐式类型转换只允许一步转换
class B{
public:
string B_s;
B() = default;
B(string s) : B_s(s){};
};
int main(){
B b1,b2;
//错误:char*->string->B,进行了两步转换
b1 = "hello";
b2 = string("hello");
return 0;
}
接受隐式类型转换得到的对象的函数,参数传递方式必须是const引用传递
因为c++中,一般不修改临时对象,所以临时对象只能传递给const引用。
A a1
:
a1进行默认初始化,调用默认构造函数A()
a1 = 2
operator=
拷贝给a1operator=
必须接受const引用,否则造成编译错误A a2 = 2
A(const A&)
,相当于A a2(A(2))
A(const A&)
必须接受const引用,否则造成编译错误特别注意
编译器会将A a2(A(2))
优化为A a2(2)
所以程序输出“A(int i)”,而不是“A(const A&)”
但是底层仍然调用了A(const A&),所以如果把A(const A&)改为A(A&),会造成编译错误 error: cannot bind non-const lvalue reference of type 'A&' to an rvalue of type 'A'
这提示我们,在编写c++程序时,如果不改变对象的值,那么习惯性地采用const引用会避免许多难解的编译错误
用a1直接初始化a3,调用A(const A&)
到此这篇关于c++隐式类型转换存在的陷阱的文章就介绍到这了,更多相关c++隐式类型转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: c++隐式类型转换存在的问题解析
本文链接: https://www.lsjlt.com/news/140811.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0