读书人

当把对象作为实参时如若形参的类型与

发布时间: 2013-08-01 15:23:18 作者: rapoo

当把对象作为实参时,如果形参的类型与对象不同,会调用那些重载的运算符(比如赋值运算符和类型转换运算符)?
我还没看到运算符重载那个地方,但是突然想到这个问题了,想马上知道。
[解决办法]
不同的话,那你得采用多态的方式了。
[解决办法]
计算机组成原理→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)
3)类型转换运算符函数//例如:B类的operator A()
这些函数,会用来进行隐式转换,具体如何运作,没记住,查书吧。
赋值运算好像不会被用在隐式类型转换上吧
[解决办法]
引用:
Quote: 引用:

1)单参数构造函数 //例如:A类的单参数构造函数 A(const B& b )
2)赋值运算符函数 //例如:A类的赋值运算符 A operator =(const B& b)
3)类型转换运算符函数//例如:B类的operator A()
这些函数,会用来进行隐式转换,具体如何运作,没记住,查书吧。
赋值运算好像不会被用在隐式类型转换上吧

是吗?也许记错了!!
[解决办法]
假设形参为 A, 实参的类型为 B. 那么会调用:
1. A 的以 B 为参数的构造函数. A(const B& b), 但是如果构造函数前声明了 explicit 则不能调用这个构造函数.
2. B 的向 A 转型的函数. B::operator A()


[解决办法]

引用:
Quote: 引用:

1)单参数构造函数 //例如:A类的单参数构造函数 A(const B& b )
2)赋值运算符函数 //例如:A类的赋值运算符
A& operator =(const B& b)
或者 const A& operator =(const B& b)

3)类型转换运算符函数//例如:B类的operator A()
这些函数,会用来进行隐式转换,具体如何运作,没记住,查书吧。
赋值运算好像不会被用在隐式类型转换上吧


赋值运算好像不会被用在隐式类型转换?
会的,会用于隐形转换的,不过格式有点问题,已经改了。



[解决办法]
引用:
Quote: 引用:

Quote: 引用:

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
[解决办法]
引用:
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;
}


VC 2010,DEV C++ 通过。
[解决办法]
终于明白了,
有至少两种情况,使用隐式转换,1)赋值2)初始化

赋值运算符,可以直接处理赋值操作,可以认为没有使用隐式转换;

不同类型之间赋值是,如果有赋值运算符函数,直接调用赋值运算符,这个不算是隐式转换,也不是显式转换。

如果没有定义赋值运算符,也可以使用隐式转换。

初始化,则可能会使用隐式转换;

而转换运算符,和单参数构造函数,则会用于隐式转换。



读书人网 >C++

热点推荐