zoukankan      html  css  js  c++  java
  • 自动类型转换之构造函数

    在c/c++中,如果编译器看到一个表达式或函数调用使用了一个不适合的类型,它经常会执行一个自动类型转换,从现在的类型到所有要求的类型。在内置类型中我们经常看到例如:

    char c;

    int i=c;

    上述语句就执行了自动类型转换。但是上面只是内置类型的自动类型转换,在c++中,还支持用户自定义的自动类型转换。有两种方法可以实习,第一种方法就是特殊类型的构造函数,第二种就是重载的运算符。

    首先介绍第一种,特殊的构造函数。如果定义一个构造函数,这个构造函数把另一个类型的对象或者引用当做它的单个参数,那么这个构造函数允许编译器执行自动类型转换。

     1 #include<iostream>
     2 using namespace std;
     3 class One{
     4 public:
     5     One(){
     6         cout << "One()" << endl;
     7         cout << "&vr=" << (long)this<< endl;
     8     }
     9     ~One(){
    10         cout << "~One()" << endl;
    11     }
    12 };
    13 
    14 class Two{
    15 
    16 public:
    17     Two(const One& vr){//Two的构造函数,有一个One类型的引用当做参数
    18         cout << "Two(const One&)" << endl;
    19         cout << "&vr=" << (long)&vr << endl;
    20     }
    21     ~Two(){
    22         cout << "~Two()" << endl;
    23     }
    24 };
    25 
    26 void fun(const Two& vr){
    27     
    28     cout << "fun(Two)" << endl;
    29     cout << "&vr=" << (long)&vr << endl;//我们最后发现,在fun中的对象的地址和main函数中定义的One对象的地址不一样,可以推断,是从新生成了一个新的对象。
    30 }
    31 
    32 int main(){
    33     One one;
    34     fun(one);
    35     return 0;
    36 }

    当编译器看到f()以类One的对象为参数调用时,编译器检查f()的声明并注意到f()函数需要一个类Two的对象作为参数,然后编译器检查是否有从对象One到Two的方法。它发现了构造函数Two::Two(const One&),然后Two::Two(const One&)被调用,就会生成一个Two对象,然后Two对象被传递给f()。

    但是有时候通过构造函数自动类型转换可能出现问题,为了避免这种麻烦,可以通过前面加关键字explicit(这个关键字只能用于构造函数)来对上例类Two的构造函数进行改进。

     1 class Two{
     2 
     3 public:
     4     explicit Two(const One& vr){//添加了关键字explicit
     5         cout << "Two(const One&)" << endl;
     6         cout << "&vr=" << (long)&vr << endl;
     7     }
     8     ~Two(){
     9         cout << "~Two()" << endl;
    10     }
    11 };

    这是在main函数中就不能f(one)这样调用f函数了,要f(Two(one));这样调用函数f。

  • 相关阅读:
    jQuery 往table添加新内容有以下四个方法:
    Postgresql 截取字符串
    如何取得select结果数据集的前10条记录。postgresql
    postgreSQL除法保留小数
    Java面试——微服务
    Vue面试中,经常会被问到的面试题/Vue知识点整理
    Java面试之五大框架的理解
    Session共享的四种方法
    ES6参考---三点运算符实质
    VUE实例课程---40、counter实例
  • 原文地址:https://www.cnblogs.com/cplinux/p/5658712.html
Copyright © 2011-2022 走看看