博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++中的隐式转换
阅读量:2385 次
发布时间:2019-05-10

本文共 1426 字,大约阅读时间需要 4 分钟。

首先,对于创建一个对象:

1.开辟出一块空间

2.往里面填充一些垃圾值

3.使用构造函数对对象进行初始化

这里根据写法不同编译器会选择调用普通构造函数,或者拷贝构造函数或者赋值函数进行初始化,但是使用每种方式都要避免踩到相应的坑,比如使用普通构造函数就会遇到的问题。

首先,对于使用普通构造函数进行初始化对象,一般有两种方式:

1.

A a = A();//调用默认构造函数

A a = A(xx);//调用带参的构造函数

A a(xx);//调用带参的构造函数的简写形式

A a;//调用默认构造函数的简写形式

2.

使用初始化列表的方式调用构造函数

但是如果出现下面的的情况:

 
  • class Complex{

  • public:

  • Complex(double r, double i=0)

  • :m_real(r), m_imag(i){

  • cout<<"constructor function:"<<endl;

  • cout<<"m_real = "<<m_real<<" m_imag = "<<m_imag<<endl;

  • }

  • Complex(){

  • cout<<"No-argument constructor function:"<<endl;

  • }

  • friend void print(Complex c);

  • private:

  • double m_real;

  • double m_imag;

  • };

  •  
  • void print(Complex c){

  • cout<<"m_real = "<<c.m_real<<" m_imag = "<<c.m_imag<<endl;

  • }

  •  
  • int main(int argc, char *argv[])

  • {

  • Complex c1 = 5;

  • Complex c2;

  • c2 = 4;

  • print(10);

  • return 0;

  • }

这个时候就出现了complex c1=5的这种写法,这种写法就等于发生了一次隐式转换,即由int型隐式转换成了一个对象类型,那么是怎么发生这种转换的呢,是由于构造函数中存在单个参数造成的:

  • Complex(double r, double i=0)

  • :m_real(r), m_imag(i){

  • cout<<"constructor function:"<<endl;

  • cout<<"m_real = "<<m_real<<" m_imag = "<<m_imag<<endl;

  • }

此时编译器默认将Int类型当成5传进去构造出了一个对象。

这种写法有时候会造成一些错误:

 
  • #include <iostream>

  • using namespace std;

  •  
  • class MyString{

  • public:

  • MyString(int size){} //构造函数

  • MyString(const char* s=NULL){}//构造函数2

  • };

  •  
  • int main(){

  • MyString s1 = 'a';//这里原意是想用字符串"a"初始化s1,

  • //结果不小心将双引号""打成单引号''

在这种情况下,本来想创建一个对象s1,并给其初始化为a,即此时想要调用构造函数2,但是因为失误,而正好,有构造函数1满足条件被调用,就创建了97个空字符串对象,这显然是不对的。

所以对于单参的构造函数,容易发生隐式转化,避免的方法加上explicit关键字。

这种写法容易违背本身创建对象的目的,应该尽量避免。

转载地址:http://pwbab.baihongyu.com/

你可能感兴趣的文章
设置WordPress评论头像为圆角鼠标触碰后旋转效果
查看>>
WordPress:删除多说插件的版权信息
查看>>
查询表中两个条件下的数目,按三列组成表
查看>>
WinForm下禁止TextBox右键菜单
查看>>
C#_winform_DataGridView_的18种常见属性
查看>>
C# 扩展系统类string的方法
查看>>
webBrowser强制在本窗口打开,禁止在新窗口打开
查看>>
C#获取CPU序列号代码、硬盘ID、网卡硬件地址等类文件
查看>>
Html常用符号
查看>>
WinForm控制Webbrowser自动登录
查看>>
access表(.mdb文件) 导入 power designer
查看>>
PowerDesigner如何设计表之间的关联
查看>>
SQLite通用数据库类
查看>>
CMD下修改IP地址!
查看>>
安卓手机可以连上wifi但无法上网的解决办法
查看>>
C++程序员常用工具集
查看>>
在CSDN博客中添加量子恒道统计功能的做法
查看>>
C++调用IDL程序的做法(一)
查看>>
外部修改应用程序图标的做法
查看>>
database disk image is malformed解决方法
查看>>