C++:复Complex类的实现过程

    技术2022-07-13  62

    1、不带指针的

    #pragma once #ifndef __COMPLEX__ #define __COMPLEX__ class complex { double re, im;//他们是私有的,一般不能直接取得,要取在private中建立的是非成员函数,例如友元函数 friend complex& __doapl(complex&, const complex&); public: complex(double r =0, double i = 0):re(r),im(i){}//首先,需要去考虑构造函数,注意带着指针的需要带析构函数 //然后,分析需要具备的能力 complex& operator += (const complex&);//想把它设计成成员函数,所以放在这里面 double real() const { return re; } double imag() const { return im; }//这两个函数是取出,没有改变,所以加const }; #endif // !__COMPLEX__ #include"complex.h" inline complex& complex::operator+=(const complex& r) { return __doapl(*this, r); } complex& __doapl(complex& ths, const complex& r)//友元函数不用::的域来定义 { complex* p = new complex; (*p).im = ths.im + r.im; (*p).re = ths.re + r.re; return (*p); }

    2、带指针的

    #pragma once #ifndef __MYSTRING__ #define __MYSTRING__ class String { char* m_data;//这里是带有指针的类 public: //String() { char* name_ = "youngman"; m_data = name_; } String() { m_data = "youngman"; }//可以直接给字符串数组的指针赋值,而不能给数组名赋值。 String(char* s) { m_data = s; } String(const String& str) { m_data = str.m_data; }//拷贝构造 String& operator =(const String& str); ~String() { delete[] m_data; } char* getStr() { return m_data; } }; #endif // !__MYSTRING__ #include"MyString.h" //浅拷贝,拷贝的是改变指针方向,指向同一块内存,一个对象改变会影响另一个引用值,指针拷贝,危险的一种拷贝 //深拷贝就是不影响,内容拷贝 /* String& String::operator=(const String& str) { delete[] m_data;//这里是清空m_data指针指向的内存空间,并不是删除指针 m_data = new char[strlen(str.m_data) + 1];//因为strlen不把空格计算在内,重新分配指针的内存需要用new //*m_data = *(str.m_data); strcpy(m_data, str.m_data); return *this; }*/

    补充: 1、构造函数和析构函数的作用是管理类对象的创建和删除。 2、友元,C++机制使得非成员函数(相对于public的成员函数)可以访问私有数据,友元函数定义的时候不用谢类作用域符号:: 3、运算符重载是一种形式的C++多态。 4、注意:不要返回局部变量或临时对象的引用,应为在函数结束是局部变量会被删除,临时对象内存空间中的数据会被释放。 5、运算符重载,其实也是一种成员函数,例如,对象a与b相加,可以写成a.operator+(b);为了方便编译器可以通过a+b;来实现。 6、对象a+b+c;//+重载是从左到右,以左边的为对象,所以写成a.operator+(a+b);–>a.operator+(a.operator+(b));从而能正确实现。

    Processed: 0.025, SQL: 9