c++自动类型转换

一、内置类型转换

在C++中,当涉及到内置类型的数据类型转换时,如果两种数据类型是兼容的,C++会自动进行类型转换。然而,需要注意从更大的数转换为更小的数时,可能会发生截断或精度损失。

long count = 8;      // int 转换为 long
double time = 11;    // int 转换为 double
int side = 3.33;     // double 转换为 int,小数部分会被截断

C++不会自动转换不兼容的数据类型。例如,下面的语句是非法的:

int* ptr = 8;

二、 类相关类型的转换(隐式类型转换)

当涉及到类类型时,从某种类型转换为类类型是有意义的。例如,将一个字符串转换为一个自定义的类类型:

string str = "我是一只傻傻鸟。";

在C++中,我们可以使用一个参数的构造函数作为自动类型转换函数,这使得类型转换可以自动进行,无需显式指定。

class MyClass{
public:
    int a_;
    MyClass(){
        cout << "默认构造函数" << endl;
    }
    MyClass(int a){
        a_=a;
        cout<<"有参构造函数"<<endl;
    }
};
  • 常规写法
    int main(){
    	MyClass myclass(10);
    }
    输出:
    有参构造函数
    
  • 显式转换
    int main(){
        MyClass myclass= MyClass(10);
    }
    输出:
    有参构造函数
    
  • 隐式转换1
    int main(){
        MyClass myclass=8;
    }
    输出:
    有参构造函数
    
  • 隐式转换2
    int main(){
        MyClass myclass;//创建对象
        myclass=8;//隐式转换,使用 MyClass(8) 创建临时对象,再赋值给 myclass
    }
    输出:
    默认构造函数
    有参构造函数
    

自动类型转换注意事项

  1. 一个类可以有多个转换函数。

    class MyClass{
    public:
        int a_;
        double b_;
        MyClass(){
            cout << "默认构造函数" << endl;
        }
        MyClass(int a){
            a_=a;
            cout<<"有参构造函数MyClass(int a)"<<endl;
        }
        MyClass(double b){
            b_=b;
            cout<<"有参构造函数MyClass(double b)"<<endl;
        }
    };
    
    int main(){
        MyClass myclass1=8;
        MyClass myclass2=3.4;
    }
    //有参构造函数MyClass(int a)
    //有参构造函数MyClass(double b)
    
  2. 多个参数的构造函数,如果除第一个参数外其他参数都有默认值,也可以作为转换函数。

    class MyClass{
    public:
        int a_;
        double b_;
        MyClass(){
            cout << "默认构造函数" << endl;
        }
        MyClass(int a,double b=3.14){
            a_=a;
            cout<<"有参构造函数"<<endl;
        }
    
    };
    
    int main(){
        MyClass myclass1=8;
    }
    
  3. 隐式转换的场景包括:

    class MyClass{
    public:
        int a_;
        MyClass(){
            cout << "默认构造函数" << endl;
        }
        MyClass(int a){
            a_=a;
            cout<<"有参构造函数"<<endl;
        }
    
    };
    
    • 将 MyClass 对象初始化为 int 值时:

      int main(){
          MyClass myclass1=8;
      }
      
    • 将 int 值赋给 MyClass对象时:

      int main(){
          MyClass myclass1;
          myclass1=8;
      }
      
    • 将 int 值传递给接受 MyClass参数的函数时 :

      void func(MyClass myclass){
      
      }
      
      int main(){
          func(0);
      }
      
    • 返回值被声明为 CGirl 的函数试图返回 int 值时

      MyClass func() {
      	int a=9;
          return a;
      }
      
      int main() {
          MyClass myclass = func();
      }
      
    • 在上述任何一种情况下,使用可转换为 int 类型的内置类型时

      MyClass func() {
      	char a=9;//char类型可以转换为int类型
          return a;
      }
      
      int main() {
          MyClass myclass = func();
      }
      
    • 如果自动类型转换存在二义性,编译将报错。

尽管将构造函数用作自动类型转换函数在某些情况下很方便,但有时候会导致意外的类型转换。为了控制自动特性,可以使用 explicit 关键字来关闭这种自动转换特性,但仍然允许显式转换。

class MyClass {
public:
    int a_;

    MyClass() {
        cout << "默认构造函数" << endl;
    }

    explicit MyClass(int a) {
        a_ = a;
        cout << "有参构造函数" << endl;
    }

};
int main() {
    MyClass myclass = 8;//error: no viable conversion from 'int' to 'MyClass'
}

以上就是关于C++自动类型转换的简要介绍和示例代码。在实际编程中,要谨慎使用自动类型转换,以避免不必要的错误和混淆。

三、 转换函数(类型转换)

转换函数(conversion function)是一种特殊类型的类成员函数。它定义了一个由用户定义的转换,以便把一个类对象转换成某种其他的类型。
在类的声明中,通过指定关键字operator,并在其后加上转换的目标类型后,我们就可以声明转换函数。
转换函数采用如下的一般形式:

operator type()

这里的type可用内置类型、类类型或typedef名取代。但是不允许type表示数组或函数。
转换函数必须是成员函数,它的声明不能指定返回类型和参数列表。
如果转换函数没有类成员进行修改,可以在函数声明中增加const关键字,增加代码的健壮性。
例如:

class MyClass {
public:
    int a_;

    MyClass(){
        a_=30;
    }
    operator int () {
        return a_;
    }
};

int main() {
    MyClass myclass;
    int a = myclass;
    cout<<a<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值