在复数类模板中使用友元函数实现复数相加

程序代码(这段代码在vc6.0中不能编译通过,在VS中能编译通过)

<span style="font-size:18px;">#include <iostream>

using namespace std;

template<class T>//类声明前加模板的声明

class Complex
{
public:
      Complex( )
      {
          real=0;
          imag=0;
      }      

      Complex(T r,T i)
      {
          real=r;
          imag=i;
      }

      //利用了模板的外部函数要作为友元函数,注意声明方式:类声明中也必须给出模板声明。
      template<class T> friend Complex<T> complex_add(Complex<T> &c1, Complex<T> &c2);
      void display( );//显示复数

private:
      T real;//复数的实部
      T imag;//复数的虚部
};

//利用了模板的友元函数的定义
template<class T>
Complex<T> complex_add(Complex<T> &c1, Complex<T> &c2)
{
    Complex<T> c3;  

    c3.real=c1.real+c2.real;
    c3.imag=c1.imag+c2.imag;  

    return c3;
}  

template<class T>
void Complex<T>::display( )//显示复数
{

    if(imag > 0)//当虚部大于0时
    {
        cout<<real<<'+'<<imag<<'i';
    }
    else if(0 == imag)//当虚部等于0时
    {
        cout<<real;
    }
    else//当虚部小于0时
    {
        cout<<real<<imag<<'i';
    }
}

int main( )
{
    Complex<double> Cmp1(8,-2), Cmp2(7,10), Cmp3;

    //两个复数相加
    Cmp1.display();
    cout<<" + ";
    Cmp2.display();
    cout<<" = ";
    Cmp3 = complex_add(Cmp1,Cmp2);
    Cmp3.display();
    cout<<endl;

    system("pause");
}</span>

执行结果:

在复数类模板中使用友元函数实现复数相加

时间: 2024-10-08 21:44:37

在复数类模板中使用友元函数实现复数相加的相关文章

在复数类中自定义类型转换函数实现复数和非复数之间的运算

实现复数+double型数据,并且打印运算后实部上的数据 #include <iostream> using namespace std; class Complex { public: Complex( )//定义默认构造函数初始化复数 { real=0; imag=0; } //使用初始化表初始化复数 Complex(double r, double i):real(r),imag(i){} //定义自定义类型转换函数 operator double() { return real; }

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

Thinkphp模板中使用自定义函数的方法

注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### } 说明: { 和 $ 符号之间不能有空格,后面参数的空格就没有问题: ###表示模板变量本身的参数位置 : 支持多个函数,函数之间支持空格 : 支持函数屏蔽功能,在配置文件中可以配置禁止使用的函数列表 : 支持变量缓存功能,重复变量字串不多次解析. 使用例子: {$webTitle|md5|st

C++中的友元函数和友元类

#include <iostream> using namespace std; class myClass1 { public : myClass1():n(0){}; void setn(int tmpn){this->n=tmpn;} void show(){cout<<n<<endl;} private: //友元类 friend class myClass2; //使用友元函数来改变myclass1中成员变量n的值 friend void setnF1(

c++ 中的友元函数的普通用法

C++中友元函数的调用,一般分为三种方式: 1.一般的友元函数 2.类A作为类B的友元类,则类A的成员函数都是类B的友元函数. 3.一个类的成员函数作为另外一个类的友元函数 //分为友元函数的例子 类A 作为测试的类,类B 是类A的友元类.class A{public: A() {  a = 100;  b = 10; } friend class B; //这儿公私均可,常常用到的是变为私有变量,类B是类A的友元类.友元的第二种方式,需要带class int getA() {  return

【C++】C++问题——类模板分离编译、函数对象、智能指针

C++类模板的分离编译 过去很多类模板都是整个类连同实现都放在一个头文件里,像STL库就是遵循这样的策略来实现类模板的.现在的标准正试图矫正这种局面. 在实现中又许多函数模板.这意味着每个函数都必须包含模板声明,并且在使用作用域操作符的时候,类的名称必须通过模板变量来实例化. 比如一个operator=的代码: template <typename Object> const MemoryCell <Object> & MemoryCell<Object>::o

队列(queue) 之 c++模板实现(友元函数和运算符重载)

一:起因 (0)拿出自己年初实现的queue队列,第一次用c++类实现queue,在和如今实现的其他复杂的STL对比,心情无比复杂: 注释:看到听到当年自己的所写所想,正的是一种享受 -- 倾听自己的幼稚也是一种美. (1)闲话少说了,我自己现在回答自己的 三 (5) 中提到的问题,函数的返回值是用bool型还是void型??其实函数返回值是bool 还是 void是视情况而定的:例如,判空函数bool isEmpty(),比较运算符重载函数 bool operator >=(&)等判断函数

第九周项目一-复数类的中的运算符重载(续)

在复数类中的运算符重载基础上 (1)再定义一目运算符 -,-c相当于0-c. (2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然 /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:赵嵩 * 文件:Demo.cpp * 完成时间:2015年05月16日 * 版本号:v1.0 */ #include <iostream> using

类模板中的static关键字

特性: 1.从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员 2. 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化 3.每个模板类有自己的类模板的static数据成员副本 原理图: 模板小结: 1.模板是C++类型参数化的多态工具.C++提供函数模板和类模板. 2. 模板定义以模板说明开始.类属参数必须在模板定义中至少出现一次. 3. 同一个类属参数可以用于多个模板. 4. 类属参数可用于函数的参数类