C++编程中类CALSS的编写(一):不含指针数据的类

首先,在我理解当中,C++编程中的类可以分为两种类型,第一种是包含指针的,另一种则是不包含的,不包含指针的类,其中private里填写自己的数据,这时候其中的数据类型比如int,double,float等等类型都是标准库里面已经写好的,也自动为我们分配了内存,不用去考虑内存分配问题,也就不会有别名的问题产生,当然此时,析构函数也不用编写了,在程序结束的时候,自动析构。此时主要编写的程序有构造函数,运算符重载和普通的成员函数,对于拷贝构造这里做一个解释就是:我们采用缺省的拷贝构造函数,因为其效率足够,也不会有浅拷贝现象,可以不予编写。

接着以一个标准库里的COMPLEX类来谈谈自己对于这部分的理解,先给出自己模仿编写的complex.h,取了标准库里的其中一部分:

#ifndef COMPLEX_H
#define COMPLEX_H                      //防卫式声明,防止重复定义
#include <iostream>
//using namespace std;                //主要是针对输出流的运算符重载使用
class complex{
public:
complex(double r = 0,double i = 0):re(r),im(i){}                //记住  初始化列表非常重要,采用赋值会产生效率低下,创建对象时先初始化再赋值,不必浪费初始化这个时间
~complex(){}
complex& operator += (const complex& rhs);
double real() const{ return re;}
double imag() const{ return im;}                                       //为了封装性,提供获得数据的接口,加上const是为了防止如果我创建一个const对象,但是调用的是非const函数,//编译器就不乐意了,你会不会改变数据不知道,所以不改变数据的函数必须要加上const
complex operator + (const complex& rhs) {                     //返回值之所以不为引用,是为了防止悬挂,如果使用引用,+号运算肯定产生一个local,当返回这个local的引用//时,在函数结束的时候会使得local对象被析构,这时候传递出来的地址已经非法
return complex(this->re + rhs.re, this->im + rhs.im);
}
complex operator + (double x) {                                      //为什么在这里写了+的运算符重载,还要在非成员函数写,问:调用者如果是非复数怎么办,放成员函数里就不能做到
return complex(x+this->re,this->im);
}
private:
double re,im;
friend complex& __doapl(complex* ths,const complex& rhs);
};
inline complex& __doapl(complex* ths,const complex& rhs){ //因为是friend 可以访问
ths->re += rhs.re;
ths->im += rhs.im;
return *ths;
}
inline complex& complex::operator += (const complex& rhs){
return __doapl(this,rhs);
}


inline complex operator + (const double x,const complex& rhs){
return complex(x+rhs.real(),rhs.imag());
}


inline complex operator + (const complex& x) {                      
return x;
}


inline complex operator - (const complex& x){
return complex(-x.real(),-x.imag());
}
inline complex conj(const complex& rhs){
return complex(rhs.real(),-rhs.imag());
};




std::ostream& operator << (std::ostream& os,const complex& rhs){        //用了ostream的全名,如果没有,编译器无法知道这个os到底在哪
return os << '(' << rhs.real() << ',' << rhs.imag() << ')';
}






#endif




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值