- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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返回,此临时对象会被自动销毁。这样的转换很方便,但也很危险(上面已经说到)。
但
您可能关注的文档
- bxdfcgxdfgdxgdxfgxdfdx..docx
- bxslbws期货_从业资格考试记忆点总结(经典)..doc
- BXPK正压型防爆控制柜(英)..doc
- bx44w三通保温旋塞阀..doc
- bx43w二通保温旋塞阀..doc
- BY11型水下不分散砼絮凝剂..doc
- BY2008灰密度测试仪..doc
- BX3002材料力学教学指导书..doc
- BY2571-II数字接地电阻测试仪..doc
- BY2010智能盐密度测试仪液体密度计..docx
- ESG研究综述与展望 .pdf
- 【可行性报告】2023年磺酸行业项目可行性分析报告 .pdf
- java中的intern()方法 _原创精品文档.pdf
- 2024年高一上数学教学计划模版(三篇) .pdf
- 学年人教版生物七年级上册第一单元 生物和生物圈专项训练试卷(含答 .pdf
- 3.1分子和原子-2024-2025学年九年级化学人教版(2024)上册+ .pdf
- 2024年钻机项目安全调研评估报告 .pdf
- 2024年电工仪器仪表项目调研分析报告 .pdf
- 必威体育精装版人教版初中物理第九章《压强》知识点大全 .pdf
- 2022-2023年湖北省某校初一(上)期中考试数学试卷(含答案)2023-09-20.pdf
文档评论(0)