c++中隐式转换与临时变量.docVIP

  • 7
  • 0
  • 约2.79千字
  • 约 9页
  • 2016-10-17 发布于重庆
  • 举报
c中隐式转换与临时变量

(1)发生的时机:当传递给操作符或者函数的参数与指定类型不匹配时,编译器将会“偷偷地”进行转换,此时就是发生了隐式转换。 (2)隐式转换发生的条件: (a)编译器原来就支持地转换:比如float型向int型转换,子类的对象(指针)向父类的对角(指针)转换,非const对象(指针)向const对象(指针)转换等等。 (b)当有类型转换操作符的时候。如果类型匹配且有必要,编译器会自动调用它。 (c)当类有一个参数个数为1的时候。如果类型匹配有必要,编译器会自动调用它。 现在主要说明(b),(c)两点: 类型转换操作符,是一个拥有奇怪名字的member funtion:关键字operator之后加上一个类型名称。如下: class Rational { public: Rational(int x,int y):m_x(x),m_y(y){} operator double()const;//将Rational转换为double. private: int m_x; int m_y; }; Rational::operator double()const //实现 { return static_castdouble(m_x)/m_y; } 如果在main函数中这样调用: Rationa rat(1,2); coutratendl;//打印0.5 同于编译器发现不存在任何operator可以接受一个Rational类型,但它会想尽办法让函数调用成功。在本例中,编译器发现只要调用Rational::double操作符便可以将rat转换为double,调用动作便会成功。于是上述代码将rat以double输出。 }; 在这里,把ArraySize嵌套放进Array内,用来修饰Array构造函数参数。 现在考虑当我们通过Array的“单自变量构造函数”定义一个对象时,会发生什么事情: Arrayint a(10); 编译器被要求调用Arrayintclass 中的一个自变量为int的构造函数,但其实并不存在这样的构造函数。编译器知道它能够将int自变量转换为一个临时的ArraySize对象,而该对象正是Arrayint构造函数需要的,所以编译器便执行了这样的转换。于是“以一个int自变量构造起一个Array对象”这个事实依然有效。再次考虑这段代码: Arrayint a(10); Arrayint b(10); ...... for(int i = 0;i 10;++i) if( a == b[i]) //a应该是“a[i]” 如今这形成了一个错误。 编译器需要一个类型为Arrayint的对象在“==”右手边,得以针对Arrayint 对象调用operator == ,但是此刻并没有“单一自变量,类型为int”这样的构造函数。此外,编译器不能考虑将一个int转换为一个临时性的ArraySize对象,然后再根据这个临时对象产生必要的Arrayint对象,因为那将调用两个用户制定转换行为(这是不允许的),一个将int转换为ArraySize,另一个将ArraySize转换为Arrayint。如此的转换程序是禁止的,所以编译器对以上代码发出错误消息。 隐式转换与临时对象 首先声明一下,这里我们所讲的临时对象,并不是指一个短暂需要的对象(如这里的temp): int temp = a,a = b,b = temp 。C++真正的临时对象是不可见的---不会出现在你的源代码中。只要你产生了一个non-heap object而没有为它命名,便诞生了一个临时对象。此等匿名对象通常发生于两种情况:一是当隐式类型转换被施行起来以求函数调用能够成功;二是当函数返回对象的时候。这里主要讲第一种情况。看以下代码: size_t countChar(const string str,char ch); char buffer[MAX_STRING_LEN]; char c; //读入一个char和一个string cincsetw(MAX_STRING_LEN)buffer; coutThere are countChar(buffer,c)occurrences of the characterc in bufferendl; 看countChar的调用动作。其第一自变量是个char数组,但是相应的函数参数类型却是const string。之所以会调用成功,是因为编译器以buffer作为自变量,调用string constructor。于是countChar的str参数会被绑定于此string临时对象上。当countChar返回,此临时对象会被自动销毁。这样的转换很方便,但也很危险(上面已经说到)。 但

文档评论(0)

1亿VIP精品文档

相关文档