c++面向对象类02

来源:互联网 发布:移动端ui框架 知乎 编辑:程序博客网 时间:2024/05/22 14:05

salary(doubble wage,string id,string name):wage(wage),employee(id,name)  salary中包含employee类的初始化。

派生类与基类的构造顺序是先基类再派生,析构顺序是相反的。


多继承下的派生类构造函数必须同时负责该派生类的所有基类构造函数的参数传递。且构造函数和析构函数的调用顺序和单继承是一样的(可参考C++之继承与派生(2) ),先调用基类构造函数,再调用对象成员的构造函数,最后调用派生类的构造函数。那么处于同一层次的各个基类构造函数的调用顺序是取决于声明派生类时所指定的各个基类的顺序。


虚基类,基类是a,b,c都继承a,d继承b,c 现在a里面有一个name的变量,这样实例化d,就有两个name副本,造成二义性,为了解决这个问题,引入虚基类public virtual,只有基类的一个拷贝,去掉了二义性。


运算符重载,实现各种类型运算符应用到自定义类型

#include "stdafx.h"#include <iostream>class Complex //复数类{public:double real;//实数double imag;//虚数        Complex(double real=0,double imag=0)        {this->real=real;this->imag=imag;        }};Complex operator+(Complex com1,Complex com2)//运算符重载函数{return Complex(com1.real+com2.real,com1.imag+com2.imag);}int main(){    Complex com1(10,10),com2(20,20),sum;    sum=com1+com2;//或sum=operator+(com1,com2)    std::cout<<"sum的实数部分为"<<sum.real<<std::endl;    std::cout<<"sum的虚数部分为"<<sum.imag<<"i"<<std::endl;return0;}

运算符重载函数是不属于任何的类,是全局的函数,重载函数可以访问类中的public成员变量,如果成员变量是私有的,那么就要在类中声明重载运算符函数是友元函数。  friend Complex operator+(Complex com1,Complex com2);//友元函数重载双目运算符+


对于成员函数重载运算符而言,双目运算符的参数表中仅有一个参数,而单目则无参数。同样的是重载,为什么和友元函数在参数的个数上会有所区别的。原因在于友元函数,没有this指针

1.在C++里编译器是根据运算符重载函数参数表里是否插入关键字int来区分前置还是后置运算。比如:

复制代码
 1 #include "stdafx.h"
2 #include <iostream>
3
4 class TDPoint//三维坐标
5 {
6 private:
7 int x;
8 int y;
9 int z;
10 public:
11 TDPoint(int x=0,int y=0,int z=0)
12 {
13 this->x=x;
14 this->y=y;
15 this->z=z;
16 }
17 TDPoint operator++();//成员函数重载前置运算符++
18 TDPoint operator++(int);//成员函数重载后置运算符++
19 friend TDPoint operator++(TDPoint& point);//友元函数重载前置运算符++
20 friend TDPoint operator++(TDPoint& point,int);//友元函数重载后置运算符++
21 void showPoint();
22 };
23
24 TDPoint TDPoint::operator++()
25 {
26 ++this->x;
27 ++this->y;
28 ++this->z;
29 return*this;//返回自增后的对象
30 }
31
32 TDPoint TDPoint::operator++(int)
33 {
34 TDPoint point(*this);
35 this->x++;
36 this->y++;
37 this->z++;
38 return point;//返回自增前的对象
39 }
40
41 TDPoint operator++(TDPoint& point)
42 {
43 ++point.x;
44 ++point.y;
45 ++point.z;
46 return point;//返回自增后的对象
47 }
48
49 TDPoint operator++(TDPoint& point,int)
50 {
51 TDPoint point1(point);
52 point.x++;
53 point.y++;
54 point.z++;
55 return point1;//返回自增前的对象
56 }
57
58 void TDPoint::showPoint()
59 {
60 std::cout<<"("<<x<<","<<y<<","<<z<<")"<<std::endl;
61 }
62
63 int main()
64 {
65 TDPoint point(1,1,1);
66 point.operator++();//或++point
67 point.showPoint();//前置++运算结果
68
69 point=point.operator++(0);//或point=point++
70 point.showPoint();//后置++运算结果
71
72 operator++(point);//或++point;
73 point.showPoint();//前置++运算结果
74
75 point=operator++(point,0);//或point=point++;
76 point.showPoint();//后置++运算结果
77
78 return0;
79 }
复制代码

com+1.5  两个方式实现相加,第一个就是重载+运算符,第二个是转化构造函数。(虚部是0)


 C++的异常处理机制有3部分组成:try(检查),throw(抛出),catch(捕获)。把需要检查的语句放在try模块中,检查语句发生错误,throw抛出异常,发出错误信息,由catch来捕获异常信息,并加以处理。一般throw抛出的异常要和catch所捕获的异常类型所匹配。异常处理的一般格式为:

  try

  {

    被检查语句

    throw 异常

  }

  catch(异常类型1)

  {

    进行异常处理的语句1

  }

  catch(异常类型2)

  {

    进行异常处理的语句2

  }


如果在catch块中没有指定异常信息的类型,而用删节号"...",则表示它可以捕获任何类型的异常信息;(4)如果throw不包括任何表达式,表示它把当前正在处理的异常信息再次抛出,传给其上一层的catch来处理;(5)C++中一旦抛出一个异常,如果程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序;
0 0
原创粉丝点击