当把对象作为实参时,如果形参的类型与对象不同,会调用那些重载的运算符(比如赋值运算符和类型转换运算符)?
我还没看到运算符重载那个地方,但是突然想到这个问题了,想马上知道。
[解决办法]
不同的话,那你得采用多态的方式了。
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
[解决办法]
1)单参数构造函数 //例如:A类的单参数构造函数 A(const B& b )
2)赋值运算符函数 //例如:A类的赋值运算符 A operator =(const B& b)
3)类型转换运算符函数//例如:B类的operator A()
这些函数,会用来进行隐式转换,具体如何运作,没记住,查书吧。
[解决办法]
[解决办法]
赋值运算好像不会被用在隐式类型转换上吧
1)单参数构造函数 //例如:A类的单参数构造函数 A(const B& b )
2)赋值运算符函数 //例如:A类的赋值运算符
A& operator =(const B& b)
或者 const A& operator =(const B& b)
3)类型转换运算符函数//例如:B类的operator A()
这些函数,会用来进行隐式转换,具体如何运作,没记住,查书吧。
赋值运算好像不会被用在隐式类型转换上吧
1)单参数构造函数 //例如:A类的单参数构造函数 A(const B& b )
2)赋值运算符函数 //例如:A类的赋值运算符
A& operator =(const B& b)
或者 const A& operator =(const B& b)
3)类型转换运算符函数//例如:B类的operator A()
这些函数,会用来进行隐式转换,具体如何运作,没记住,查书吧。
赋值运算好像不会被用在隐式类型转换?
会的,会用于隐形转换的,不过格式有点问题,已经改了。
Vc 2010
struct tB
{
};
struct tA
{
tA& operator=(const tB& b)
{
return *this;
}
};
void fff(const tA&)
{
}
int main(int argc, char* argv[])
{
tB b;
fff(b);
}
#include <iostream>
#include <stdlib.h>
using namespace std;
class B;
class A{
public:
explicit
A(int n=0):a(n){};
//explicit
//A(const B& ref);
const A& operator=(const B& b);
friend ostream & operator<<(ostream & os,const A &ref)
{
return os<<ref.a<<" ";
}
public:
int a;
};
class B{
public :
explicit
B(int n=0):b(n){};
//explicit
//B(const B& ref);
//operator A()const {
// return A(b);
// }
int getValue()const {return b;}
friend ostream & operator<<(ostream & os,const B &ref)
{
return os<<ref.b<<" ";
}
private:
int b;
};
//A::A(const B& ref):a(ref.getValue()){}
const A& A::operator=(const B& b){
cout<<"const A& A::operator=(const B& b) "<<endl;
cout<<"Before Copy a="<<a <<"b="<<b.getValue()<<endl;
a= b.getValue();
cout<<"after Copy a="<<a<<endl;
return *this;
}
int main(int argc, char *argv[])
{
A a; B b(10);
cout<<"In Main Before Copy a= "<<a<<"b="<<b<<endl;
a=b;
cout<<"In Main After Copy a= "<<a<<"b="<<b<<endl;
system("PAUSE");
return 0;
}