c++中的隐式转换

博客介绍了创建对象的步骤,包括开辟空间、填充垃圾值和用构造函数初始化。阐述了使用普通构造函数初始化对象的两种方式,指出单参构造函数易发生隐式转化,可加explicit关键字避免,强调要避免违背创建对象目的的写法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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关键字。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值