首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

当把对象作为实参时,如若形参的类型与对象不同,会调用那些重载的运算符(比如赋值运算符和类型转换运算符)

2013-08-01 
当把对象作为实参时,如果形参的类型与对象不同,会调用那些重载的运算符(比如赋值运算符和类型转换运算符)?

当把对象作为实参时,如果形参的类型与对象不同,会调用那些重载的运算符(比如赋值运算符和类型转换运算符)?
我还没看到运算符重载那个地方,但是突然想到这个问题了,想马上知道。
[解决办法]
不同的话,那你得采用多态的方式了。
[解决办法]
计算机组成原理→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)初始化

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

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

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

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

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



热点排行