《C++语言基础》参考——转换构造函数与类型转换函数

返回:贺老师课程教学链接

下面的程序,想在main函数中要完成实数加复数、复数加实数,不可以。编译下面的程序出现错误,就是因为没有提供对应类型数据的运算符重载函数。

#include <iostream>
using namespace std;
class Complex
{
public:
    Complex():real(0), imag(0){}
    Complex(double r,double i):real(r), imag(i){}
    Complex operator+(const Complex &c2);
    void display();
private:
    double real;
    double imag;
};

//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i
Complex Complex::operator+(const Complex &c2)
{
    Complex c;
    c.real=real+c2.real;
    c.imag=imag+c2.imag;
    return c;
}

void Complex::display()
{
    cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
//下面定义用于测试的main()函数
int main()
{
    Complex c1(3,4),c2,c3;
    c2=2.5+c1;
    c3.display();
    c3=c1+2.5;
    c3.display();
    return 0;
}

解决方案1:增加实数加复数、复数加实数的运算符重载函数,详见《复数类重载》中的第(3)部分。
解决方案2:设计转换构造函数。将2.5之类的实数,转换为实部为2.5的复数(符合数学中的定义),然后进行运算。

类定义为:

class Complex
{
public:
    Complex():real(0), imag(0){}
    Complex(double r):real(r), imag(0){}   //转换构造函数
    Complex(double r,double i):real(r), imag(i){}
    Complex operator+(const Complex &c2);
    void display();
private:
    double real;
    double imag;
};

当main函数不改变时,错误仍然在。这说明,系统不会自动在2.5+c1时,自动将2.5转换为复数类的对象。
当将main函数改为如下形式时,运算顺利进展:

int main()
{
    Complex c1(3,4),c2,c3;
    c2=Complex(2.5)+c1;
    c2.display();
    c3=c1+Complex(2.5);
    c3.display();
    return 0;
}

Complex(2.5)?这不就是强制类型转换吗?int(2.5)还记得否,强制将2.5转换为int型!
解决方案3:设计类型转换函数。类的定义如下:

class Complex
{
public:
    Complex():real(0), imag(0){}
    operator double( ) {return real;}   //类型转换函数
    Complex(double r,double i):real(r), imag(i){}
    Complex operator+(const Complex &c2);
    void display();
private:
    double real;
    double imag;
};

若用原main函数测试,仍然有错。请思考为什么?也可以在看完下文后再思考。
main函数如下改:

int main()
{
    Complex c1(3,4);
    double d2,d3;
    d2=2.5+c1;
    cout<<d2<<endl;
    d3=c1+2.5;
    cout<<d3<<endl;
    return 0;
}

程序编译没有问题。operator double( ) 类型转换函数的定义,其实支持了Complex类型向double的自动类型转换。
只是遗憾的是,复数中的虚部,在转换中被丢掉了。

从这篇文章中,我们可以看出转换构造函数与类型转换函数的用法,以及应用的场合。

时间: 2024-11-10 01:29:01

《C++语言基础》参考——转换构造函数与类型转换函数的相关文章

C++语言基础 例程 默认构造函数

贺老师的教学链接  本课讲解 默认构造函数(default constructor) class Time { public: Time( ); void show_time(); private: int hour; int minute; int sec; }; Time::Time( ) { hour=0; minute=0; sec=0; }

C++语言基础 例程 调用构造函数和析构函数的顺序

贺老师的教学链接  本课讲解 析构函数应用实例方案1 const int N =500; class Salary { public: Salary(int); void input( ); void show( ); ~Salary(); private: double salarys[N]; int number; //实际人数 }; 方案2 class Salary { public: Salary(int); void input( ); void show( ); ~Salary();

C++语言基础 例程 类声明和成员函数定义的分离

贺老师的教学链接  本课讲解 1.一个程序,一个源文件的做法 #include<iostream> #include<cstring> using namespace std; class Student { private: char Name[20]; //学生姓名 double Chinese; //语文成绩 double Math; //数学成绩 public: double Average( );//计算平均成绩 double Sum( ); //计算总分 void Sh

C++语言基础 例程 有默认参数的函数

贺老师的教学链接 形参/实参.声明/调用/定义 #include <iostream> using namespace std; int max(int a, int b, int c=0);//仅声明时设默认 int main( ) { int a,b,c; cin>>a>>b>>c; cout<<"max(a,b,c)="<<max(a,b,c)<<endl; cout<<"m

《C++语言基础》网络课程主页

返回 贺利坚教学链接 本课程是在大学的实体课程基础上建设的一门网络课程,将我在教学中建设的资源,让更多的人能够用到. 课程链接是:点击打开链接 同步实体课在 点击打开链接,那里有92名同时学习的"同学",以及他们的博客链接. 坚持这门课程学习的学员,请在评论处留言,我将建立专门的链接,一起建设学习的氛围. 学员链接:(待加) 课程内容 一.从C到C++ 课时 视频 示例程序 自测 学习指导与实践 实践项目参考解答 1.1 由C语言到C++(暨本课介绍) 链接   1.2 C语言的基本成

C++的四个显式的数据类型转换函数

1 reinterpret_cast(在编译期间实现转换) reinterpret_cast类型转换函数将一个类型的指针转换成另一个类型的指针.这种转换不用于修改指针变量值数据存放的格式(不改变指针变量值),只需在编译期间重新解释指针的类型就可以做到. reinterpret_cast可以将指针值转换为一个整型数.但是不能用于非指针类型的转换,否则将不会通过编译. 什么时候使用reinterpret_cast进行数据类型的转换: (1)将基本类型指针转换成另一个类型的指针. 例如: 基本类型指针

c语言-关于C++转换成C的问题,和C语言基础问题 就大神帮帮小弟

问题描述 关于C++转换成C的问题,和C语言基础问题 就大神帮帮小弟 首先能不能帮我查一下错误: #include<math.h> #include<malloc.h> #include<iomanip.h> #include<stdlib.h> #include<string.h> #include<conio.h> #define N 10 float MatDet(float *p, int n); float Creat_M(

《C++语言基础》实践参考——复数模板类

返回:贺老师课程教学链接 [项目6-复数模板类]    阅读教材例10.1.该例实现了一个复数类,但是美中不足的是,复数类的实部和虚部都固定只能是double型的.可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时指定的实际类型.    (1)要求类成员函数在类外定义.    (2)在此基础上,再实现减法.乘法和除法    你可以使用的main()函数如下. int main( ) { Complex<int> c1(3,4),c2(5,-10),c3; //实部和虚

C++语言基础 例程 不同类型数据间的转换

贺老师的教学链接  本课讲解 //类型转换函数应用 #include <iostream> using namespace std; class Complex { public: Complex( ) { real=0; imag=0; } Complex(double r,double i) { real=r; imag=i; } operator double( ); friend Complex operator + (Complex c1,Complex c2); private: