explicit 用法和匿名对象的问题

本文探讨C++中显式与隐式类型转换的区别,特别是使用explicit关键字的作用,并讨论了匿名对象的构造和析构特性。通过具体示例说明了如何避免类型转换时的歧义。

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

//当重载了转换运算符后,宜用explicit 标明显式转换要求

 

class A;
class B;

class A
{
public:
 A(){}
 explicit A(B& other)
 { //B转换成A
  printf("A: B to A\n");
 }
};

class B
{
public:
 B(){ printf("B\n");}
 operator A()
 { //B转换成A
  printf("operator: B to A\n");
  return A();
 }
};

void testTo(A a)
{
}

void main()
{
 B b;
 A a1 = b; //未explicit时有岐义,但编译器未提示,并默认用构造函数来转换
 testTo(b);//未explicit时有岐义, 编译器能识别, 任选构造或操作符之一去掉其功能也可消除岐义
 system("pause");
}

 

 

//---------------------------------------------

 

#include <iostream>

using namespace std;


class A
{
public:
 A(int n):m_n(n){ printf("A\n");}
 ~A(){ printf("~A\n"); }
 int m_n;
};

class B
{
public:
 explicit B(int n):m_n(n),bCopy(false)
 {
  printf("B\n");
 }
 B(B& b):m_n(b.m_n),bCopy(true)
 {//拷贝构造函数
  printf("copy B\n");
 }
 ~B()
 {
  if( bCopy) printf("copy ~B\n");
  else printf("~B\n");
 }
 int m_n;
private:
 bool bCopy;
};

void testA(A a)
{
}

void testB(B b)
{
}

void test()
{
 A a = 3;//隐式转换
 testA(3);

 //B b = 3; 隐式转换,error
 //testB(3); error
 B b(3);//显式转换
 testB( b);
}

void main()
{
 test();
 system("pause");
}

 

 

//--------------------------------------------

发现一个匿名对象的问题

上方test函数里如果是以下这样调用:

 testB( B(3));

那么会发现类的构造函数没被调用。

莫非匿名对象不会调用类的构造函数? 而且有无实现拷贝构造函数也会影响匿名对象的构造和析构情况? 不明。。。

 

匿名对象还可以这样用:

const2buffer b = const2buffer(pTest);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值