- 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返回,此临时对象会被自动销毁。这样的转换很方便,但也很危险(上面已经说到)。
但
您可能关注的文档
最近下载
- 2026年高考全国II卷文科综合真题试卷(新课标卷)(+答案).docx VIP
- 安路科技(688107)补国产短板,突高端应用,拓新应用与技术大市场-240717-东北证券-38页.pdf VIP
- [搞笑小品剧本]上当了小品剧本.docx VIP
- 全国初中数学联合竞赛真题及答案(初二组)2015-年.pdf VIP
- 数据中心800V直流供电技术白皮书2.0.pdf
- 上海大学2022-2023学年第1学期《高等数学(上)》期末考试试卷(B卷)附参考答案.pdf
- 上海大学2022-2023学年第1学期《高等数学(上)》期末考试试卷(A卷)附参考答案.pdf
- 中国教育行业人才流动与薪酬水平_2025年12月.docx
- 2024全国初中数学联赛初二卷 .pdf VIP
- AIAG-VDA-SPC手册-Yellow-Volume2026年2月第一版 中文.pdf VIP
原创力文档

文档评论(0)