避免含糊转换
参数匹配和相互转换
struct B;
struct A
{
A()=default;
A(const B&) //吧B负责给A,拷贝构造函数
{//嘿,这里我有点明白了,只要 后面调用了这个函数,那么这个函数就得有定义
//不能只声明不定义
cout<<"调用了A(const B&)转换!"<<endl;
}
};
struct B
{
operator A() const {cout<<"调用了operator A() const!"<<endl;} //吧B转换为A
};
A f(const A&) //这个要写在外面,因为下面a1会调用f这个函数- -,浪费我时间
{
cout<<"调用了函数f(const A&)!"<<endl;
}
void fun1()
{
B b;
// A a=f(b); 错误的,原因是这里有两个转换的方式,编译器不知道调用哪个
//如果我们非要调用不可,那么只能这样了
A a1=f(b.operator A()); //这里用B的转换操作
A a2=f(A(b));
}
Ambiguities and Multiple Conversions to Built-in Types
struct C
{
C(int = 0){cout<<"调用构造函数C(int=0)"<<endl;}
C(double) {cout<<"调用构造函数C(double)"<<endl;}
operator int() const {cout<<"调用操作符转换operator int()"<<endl;}
operator double() const {cout<<"调用操作符转换operator double()"<<endl;}
//...
};
void f2(long double){cout<<"调用函数f2(long double)"<<endl;}
void fun2()
{
C c();
// f2(c); //error :参数歧义
long lg;
// C c2(lg); //error :参数歧义
//再来看一个例子
short s=42;
C c3(s); //调用C::C(int)完成转换,吧short转换成int比转换成double好的多,所以呵呵
}
Overloaded Functions and Converting Constructors
struct D
{
D(int){}
};
struct E
{
E(int){}
};
void manip(const D&) { cout<<"调用void manip(const D&)"<<endl;}
void manip(const E&) { cout<<"调用void manip(const E&)"<<endl;}
void fun3()
{
// manip(10); //error: call of overloaded 'manip(int)' is ambiguous,歧义了
//我们可以这样写,直接告诉编译器要调用哪个
manip(D(10)); //OK:调用 manip(const D&)
}
Overloaded Functions and User-Defined Conversion
重载函数和用户定义的转换
struct F
{
F(double) {cout<<"调用F的构造函数F(double)"<<endl;}
};
void manip2(const D&) { cout<<"调用void manip2(const D&)"<<endl;}
void manip2(const F&) { cout<<"调用void manip2(const F&)"<<endl;}
void fun4()
{
// manip2(10); 系统不知道要用哪个
manip2(D(10));
manip2(F(10));
}
Function Matching and Overloaded Operators
class SmallInt
{
friend SmallInt operator+(const SmallInt& si1, const SmallInt& si2){cout<<"这里调用+处理"<<endl;}
public:
SmallInt(int=0){cout<<"调用SmallInt(int=0)构造函数"<<endl;}
operator int() const {return val;}
private:
size_t val;
};
void fun5()
{
SmallInt s1, s2;
SmallInt s3=s1+s2;
cout<<"??"<<endl;
// int i=s3+0; 这里歧义,s3可以转换成int类型,也可以吧0转换成SmallInt类型,然后准话成int类型
}
the all code!!!
/**
* 功能:避免含糊转换
* 时间:2014年7月20日09:18:59
* 作者:cutter_point
*/
#include<iostream>
using namespace std;
/**
参数匹配和相互转换
*/
struct B;
struct A
{
A()=default;
A(const B&) //吧B负责给A,拷贝构造函数
{//嘿,这里我有点明白了,只要 后面调用了这个函数,那么这个函数就得有定义
//不能只声明不定义
cout<<"调用了A(const B&)转换!"<<endl;
}
};
struct B
{
operator A() const {cout<<"调用了operator A() const!"<<endl;} //吧B转换为A
};
A f(const A&) //这个要写在外面,因为下面a1会调用f这个函数- -,浪费我时间
{
cout<<"调用了函数f(const A&)!"<<endl;
}
void fun1()
{
B b;
// A a=f(b); 错误的,原因是这里有两个转换的方式,编译器不知道调用哪个
//如果我们非要调用不可,那么只能这样了
A a1=f(b.operator A()); //这里用B的转换操作
A a2=f(A(b));
}
/**
Ambiguities and Multiple Conversions to Built-in Types
*/
struct C
{
C(int = 0){cout<<"调用构造函数C(int=0)"<<endl;}
C(double) {cout<<"调用构造函数C(double)"<<endl;}
operator int() const {cout<<"调用操作符转换operator int()"<<endl;}
operator double() const {cout<<"调用操作符转换operator double()"<<endl;}
//...
};
void f2(long double){cout<<"调用函数f2(long double)"<<endl;}
void fun2()
{
C c();
// f2(c); //error :参数歧义
long lg;
// C c2(lg); //error :参数歧义
//再来看一个例子
short s=42;
C c3(s); //调用C::C(int)完成转换,吧short转换成int比转换成double好的多,所以呵呵
}
/**
Overloaded Functions and Converting Constructors
*/
struct D
{
D(int){}
};
struct E
{
E(int){}
};
void manip(const D&) { cout<<"调用void manip(const D&)"<<endl;}
void manip(const E&) { cout<<"调用void manip(const E&)"<<endl;}
void fun3()
{
// manip(10); //error: call of overloaded 'manip(int)' is ambiguous,歧义了
//我们可以这样写,直接告诉编译器要调用哪个
manip(D(10)); //OK:调用 manip(const D&)
}
/**
Overloaded Functions and User-Defined Conversion
重载函数和用户定义的转换
*/
struct F
{
F(double) {cout<<"调用F的构造函数F(double)"<<endl;}
};
void manip2(const D&) { cout<<"调用void manip2(const D&)"<<endl;}
void manip2(const F&) { cout<<"调用void manip2(const F&)"<<endl;}
void fun4()
{
// manip2(10); 系统不知道要用哪个
manip2(D(10));
manip2(F(10));
}
/**
14.9.3. Function Matching and Overloaded Operators
*/
class SmallInt
{
friend SmallInt operator+(const SmallInt& si1, const SmallInt& si2){cout<<"这里调用+处理"<<endl;}
public:
SmallInt(int=0){cout<<"调用SmallInt(int=0)构造函数"<<endl;}
operator int() const {return val;}
private:
size_t val;
};
void fun5()
{
SmallInt s1, s2;
SmallInt s3=s1+s2;
cout<<"??"<<endl;
// int i=s3+0; 这里歧义,s3可以转换成int类型,也可以吧0转换成SmallInt类型,然后准话成int类型
}
int main()
{
cout<<">>----------------fun1---------------------<<"<<endl;
fun1();
cout<<">>----------------fun2---------------------<<"<<endl;
fun2();
cout<<">>----------------fun3---------------------<<"<<endl;
fun3();
cout<<">>----------------fun4---------------------<<"<<endl;
fun4();
cout<<">>----------------fun5---------------------<<"<<endl;
fun5();
return 0;
}
大家其实应该也看到了,我这个其实是前天就做完了,今天才发上来,因为我要是一做完就发的话会嘿嘿,就不能偷懒了
最近开始喜欢喝茶了,但是每次把茶叶放的多多的,好苦。。。只有冲了几次冲淡了之后那味道,越喝越甜,越喝越提神。
还有就是,坏事从来都是成双结对地来,不过根据我的经历来说,坏事过后好事似乎也是接二连三的来啊!!!