运算符重载如下:
CComplexNum CComplexNum::operator + (const CComplexNum & TNum) const
{
    return CComplexNum(realPart + TNum.realPart, imagePart +
TNum.imagePart);   
}
内部 realPart 和 imagePart 为私有成员变量,定义如下:
private:
    double realPart;
    double imagePart;
运算符重载也是成员函数..同期要理解多少个难题,在成员函数里面是足以访问私有成员的…用类名和用this指针无差别..
率先你定义的是引用,它是实参数的小名…在类的分子函数中是足以访问类的民用成员的…注意的是这时候要用对象名字分别开,这么些和用this指针是同样得…建议看看java里面就有这几个例子..在成员函数里面通过对象访问私有成员

为何要对运算符举办重载?

1、static 关键字

  • 静态属性只可以在大局范围内开打开头化赋值
  • 静态方法能够直接通过类名实行拜访,也得以经过对象名举办访谈

class Teacher {private: char* name;public: //计数器 static int total;public: Teacher(char* name) { this->name = name; cout << "Teacher有参构造函数" << endl; } ~Teacher() { cout << "Teacher析构函数" << endl; } void setName(char* name) { this->name = name; } char* getName() { return this->name; } //计数的静态函数 static void count(){ total++; cout << "total:" << total << endl; }};//静态属性初始化赋值int Teacher::total = 10;void main() { Teacher::total++; cout << Teacher::total << endl; //直接通过类名访问 Teacher::count(); cout << Teacher::total << endl; //通过对象名访问 Teacher t1"JACK"); t1.count(); cout << Teacher::total << endl; getchar();}

C/C++
内部存款和储蓄器分区:栈、堆、全局、常量区、程序代码区常常属性与构造体具备同等的内部存款和储蓄器结构

class A {public: int i; int j; int k;};class B {public: int i; int j; int k; void myprint() { cout << "打印" << endl; }};void main() { cout << sizeof << endl; cout << sizeof << endl; getchar();}

C++预约义中的运算符的操作对象只局限于基本的内置数据类型,不过对于我们自定义的类型(类卡塔尔国是绝非办法操作的。可是比非常多时候我们须求对大家定义的品种进行相近的演算,此时就需求大家对那么些运算符进行重复定义,付与新的功力,以满意自身的必要。

1、this指针

this
是近日指标的指针因为函数是分享的,全体应用this指针用来标志当前目的

class Teacher {private: char* name; int age;public: Teacher(char* name,int age) { this->name = name; this->age = age; cout << "Teacher有参构造函数" << endl; } ~Teacher() { cout << "Teacher析构函数" << endl; } void setName(char* name) { this->name = name; } char* getName() { return this->name; } void setAge { this->age = age; } int getAge() { return this->age; } void myprint() { cout << this->getName() << "," << this->getAge() << endl; }};void main() { Teacher t1"Jack", 20); Teacher t2"Rose", 18); t1.myprint(); t2.myprint(); getchar();}

C++运算符重载的本来面目:

2、常函数(const修饰函数)

常函数,修饰的是this;既不可能更正指针的值,也不能够退换指针指向的原委常量对象只好调用常量函数,无法调用特别量函数常函数当前指标不可能被改换,幸免数据成员被地下访谈

class Teacher {private: char* name; int age;public: Teacher(char* name,int age) { this->name = name; this->age = age; cout << "Teacher有参构造函数" << endl; } ~Teacher() { cout << "Teacher析构函数" << endl; } void setName(char* name) { this->name = name; } char* getName() { return this->name; } void setAge { this->age = age; } int getAge() { return this->age; } void myprint() const { printf("%#xn",this); //不能改变属性的值 //this->name = "Jason"; //不能改变this指针的值 //this = 0x000090; cout << this->getName() << "," << this->getAge() << endl; }};

运算符重载的真相就是函数重载或函数多态。运算符重载是风姿浪漫种形式的C++多态。目的在于让人能够用同名函数来成功不一样的基本操作。要重载运算符,供给选择被喻为运算符函数的离奇函数格局。

1、友元函数

在友元函数中能够访谈私有的质量

class A {private: int i;public: A { this->i = i; } void myprint() { cout << i << endl; } //友元函数 friend void modify_i(A*p, int a);};//友元函数的实现,在友元函数中可以访问私有的属性void modify_i(A*p, int a) { p->i = a;}void main() { A* a = new A; a->myprint(); modify_i; a->myprint(); getchar();}

2、友元类

友元类能够访谈征引友元类的类的任何成员

class A { //友元类 friend class B;private: int i;public: A { this->i = i; } void myprint() { cout << i << endl; } //友元函数 friend void modify_i(A*p, int a);};//友元函数的实现,在友元函数中可以访问私有的属性void modify_i(A*p, int a) { p->i = a;}class B {private: A a;public: B:a { this->a = a; } //B这个友元类可以访问A类的任何成员 void accessAny() { a.i = 30; } A getA() { return a; }};void main() { B* b = new B; A a = b->getA(); a.myprint(); b->accessAny(); a = b->getA(); a.myprint(); getchar();}

运算符的重载,本质上或然函数的调用

1. 输入和出口操作符

1、单独开展览演出算符重载

class Point {public: int x; int y;public: Point(int x = 0,int y = 0) { this->x = x; this->y = y; } void myprint() { cout << x << "," << y << endl; }};//重载+号Point operator+(Point &p1, Point &p2) { Point tmp(p1.x + p2.x, p1.y + p2.y); return tmp;}//重载-号Point operator-(Point &p1, Point &p2) { Point tmp(p1.x - p2.x, p1.y - p2.y); return tmp;}void main() { Point p1; Point p2; Point p3 = p1 + p2; p3.myprint(); getchar();}

2. 算术操作符和关系操作符

2、类成员函数运算符重载

class Point {public: int x; int y;public: Point(int x = 0, int y = 0) { this->x = x; this->y = y; } void myprint() { cout << x << "," << y << endl; } //成员函数运算符重载+号 Point operator+(Point &p2) { Point tmp(this->x + p2.x, this->y + p2.y); return tmp; } //成员函数运算符重载-号 Point operator-(Point &p2) { Point tmp(this->x - p2.x, this->y - p2.y); return tmp; }};void main() { Point p1; Point p2; //p1.operator+; Point p3 = p1 + p2; p3.myprint(); getchar();}

3. 下标操作符

3、友元函数运算符重载

当属性私不时,通过友元函数达成运算符重载

class Point { friend Point operator+(Point &p1, Point &p2); friend Point operator-(Point &p1, Point &p2);private: int x; int y;public: Point(int x = 0, int y = 0) { this->x = x; this->y = y; } void myprint() { cout << x << "," << y << endl; } };//友元函数运算符重载+号Point operator+(Point &p1, Point &p2) { Point tmp(p1.x + p2.x, p1.y + p2.y); return tmp;}//友元函数运算符重载-号Point operator-(Point &p1, Point &p2) { Point tmp(p1.x - p2.x, p1.y - p2.y); return tmp;}void main() { Point p1; Point p2; Point p3 = p1 + p2; p3.myprint(); getchar();}

4. 自加、自减操作符

生龙活虎、输入输出操作符

澳门新葡萄京官网注册 1

结果:

澳门新葡萄京官网注册 2

说明:

1) IO操作必得为非成员函数

原因:IO操作的接口再次来到的是ostream&对象(唯有再次回到左值,那样技巧延续的出口,比如cout
<< c1 << ‘,’ << c2
)。自定义的出口的操作符应该与其貌似。假诺将其定义为成员函数(有个首暗中认可参数this,既指向友好的指针卡塔尔国,左操作数只好是该品种的靶子,则不得已办到。

2) 因为要拜谒钦定类的私有成员,所以在这里类中宣示输出操作符为友元函数。

3)
第叁个形参必须为援引。因为IO对象不得以复制。同理再次回到值必得为叁个引用。

4) 第3个形参不得以为const(针对于出口卡塔尔国,因为写入到流会退换其值。

5)
首个为引用,那样能够免止复制。参数可感到const,能够收起const对象和非const对象;不然,假如为非const对象。日常为const,究竟只是出口而已,不改造指标。

注:输入与输出操作符的注重的界别:输入操作符必得管理错误和文件甘休的可能性。输入即使有七个值的话,倘使一个数错了,则前面赋值精确的已经生效,前边的用了暗许值,能够这么设计,要是输入错误,将整个对象重新设置,恢复生机到最早的处境。

澳门新葡萄京官网注册 3

结果:

澳门新葡萄京官网注册 4

二、算术操作符和关联操作符

    1) 相等操作符

澳门新葡萄京官网注册 5

因此地点的实例能够见到,拷贝布局和”=”重载的结果是千篇少年老成律的。在”=”重载函数中回到
this指针是为着三番五次赋值,而拷贝布局无需此操作就足以兑现三番一回赋值。还应该有就算重载函数有二种格局,可是”=”重载无法使用友元,这里要验证一下重载操作符的节制。

重载约束

a.
重载的操作符(部分除却State of Qatar不必是成员函数,但重载的操作符至稀有三个客户自定义的类,那是为着防止客商为正规项目重载操作符,比如八个整数的加法重载为乘法之类的;

b.
使用重载操作符不能够违反原本的语法,举例不能够把二元操作符重载为卫生院操作符。相同不能够更换优先级。

c. 不可能定义新的操作符。

d. 实际不是全数的操作符都被重载下图是局地常用的能被重载的操作符:

澳门新葡萄京官网注册 6

e.
大多数操作符都能由此分子或非成员函数重载,但以下操作符只好通过成员函数重载:

    –>  =   赋值操作符

    –>  (State of Qatar  函数调用操作符

    –>  []  下标操作符

    –>  ->  通过指针访谈类成员的操作符

要是大家重载了加法操作符,使得A+3能健康使用,那么只纵然3+A呢?因为重载时规定+左侧是目的侧边是int,所以3+A是不法的。怎样缓和吧?

貌似会利用友元。

友元有三种:友元类,友元函数,友元成员函数。

1. 友元函数的创设:加上friend关键字,注意参数的数额。

    虽然friend operator*(…卡塔尔函数在类中宣称的,但它不是成员函数,无法使用成员操作符来调用;

    就算友元函数不是成员函数,但它的拜谒权限跟成员函数相通;    

    友元函数的宣示放在共有段和私有段是同样的。

2. 友元函数与成员函数的区分:

    成员函数有this指针,而友元函数没有this指针;

    友元函数是不可能被接续的,就如阿爹的情侣未必是外甥的相恋的人。

三、下标操作符

澳门新葡萄京官网注册 7

结果:

u

下标操作必得为函数成员,因为传递三个参数,还需求另一个针对自身的指针参数,恰恰函数成员的this可以胜任。平日不要像上图那样,轻便把团结搞糊涂。

四、前后++/–

澳门新葡萄京官网注册 8

前后++

它们的区分在于后++再函数中参与了哑元参数。

别的的就不进行总计了,如有兴趣能够同步商讨。