• 从C过渡到C++的几个知识点(结构体、引用、重载运算符)


    一、结构体和类(class

    下面一个使用结构体类型的例子

     1 #include <iostream>
     2 using namespace std;
     3 struct Point{      //  声明Point结构体类型
     4     double x;    //  成员变量,没有使用private和public时系统默认为公有类型成员变量
     5     double y;
     6 };
     7 int main()
     8 {
     9     Point p;                //  定义的p在c里称为结构体变量
    10     p.x = 3.2;                 //  因为x是公有类型可以通过结构体变量直接引用使用
    11     p.y = 8.9;
    12     cout << "(" << p.x << "," << p.y << ")" << endl;    // 结构体的使用
    13     return 0;
    14 }

    类是面向对象语言的重要特征,下面是一个使用类的例子

     1 #include <iostream>
     2 using namespace std;
     3 class Point           // 
     5 {private:       //私有数据成员不能在类外普通函数中直接引用使用
     6     double x;        // 私有成员变量
     7     double y;        // 私有成员变量
     8 public:        //公有数据成员或成员函数可以在类外普通函数中直接引用使用,结构体中默认所有成员都是公有的。
     9     setPoint(double m, double n)          // 公有成员函数
    10      {     x = m; y = n;                  // 私有成员变量x y 在同为成员的函数中出现
    11      } // 并且此时不需要"."作为成员连接符 因为x y 和函数setPoint  都在Point类“内部”
    12     printPoint()                                   // 公有成员函数
    13      {    cout << "(" << x << "," << y << ")" << endl;  }  //  同上
    14 };
    15 //如果类外定义printPoint(),则函数开头为:void Point::printPoint()
    16 int main()
    17 {
    18     Point p;  //定义的p在c++里称为对象
    19     p.setPoint(3.2, 8.9);
    20 //  因为x是在类里声明为privete私有类型,在这里x不能像p.x直接引用使用,而是直接供成员函数使用
    21     p.printPoint();
    22     return 0;
    23 }//上面类的使用方法同样适用于c++里的结构体

        c++里扩展了结构体的功能,使结构体也具有类的几乎所有特点,如可以包含成员函数,构造函数等等。类与结构体的区别在于:在默认状态下(即在不声明private和public时),结构的所有成员均是公有的,而类的所有成员是私有的,公有的可以在其它函数中直接调用成员变量。

        在c++里之所以要保留struct,是为了与C兼容,让c程序可以不加修改地在c++环境下使用。

          因为我们学习的算法可以只使用结构体就可以了,所以可以在参考书中当成类来看,但是类的继承派生等没有用在我们目前学习的算法里。 

    二、this指针

    它是指向本类对象(或体结构体变量)的指针,它的值是当前被调用的成员函数所在的对象的起始地址。*this就是this所指向的结构体变量。return *this //返回当前结构体变量值 

    三、引用和指针

    int a,c;

    int &b=a; //类似指针,与指针不同点如int &b=a;&b=c;则错,因为只能引用一次。

    声明ba的引用 ,即ba的别名。在声明一个引用类型变量时,必须同时使之初始化即声明它代表哪个变量。在声明变量 是变量 的引用后,在它们所在函数执行期间,该引用类型变量 始终与变量a相联系,不能再做为其它变量的引用。常用在函数形参中,常在形参前面加const表示在该函数体内不能修改。

    四、运算符重载实际上是函数的重载

    C++中预定义的运算符(如>>,+,<,)的操作对象只能是基本数据类型(如:int,float),实际上,对于很多用户自定义类型(如:结构体)要进行类似的运算操作时需要重载(=&有时可不重载)

    运算符重载的格式如下:

    函数类型 operator 运算符名称(形参表列){对运算符的重载处理}

    赋值等运算符必须定义为类(或结构体,本文提到的类与结构体等同,对象与结构体变量等同)的成员函数(即放在类里),<<和>>不能定义为类的成员函数(即需放在类外)。 

    对“<<”和“>>”重载的函数形式如下:

     //cin和cout分别是istream和ostream类的对象
    istream & operator >> (istream &,自定义类 &) 
    ostream & operator << (ostream &,自定义类 &)
    

     下面例子重载+、>>和<<运算符

     1 #include<iostream>
     2 using namespace std;
     3 struct Complex
     4 {
     5  double real,imag;
     6  Complex(double r=0,double i=0)  {   real=r;   imag=i;  }
     7  Complex operator + (Complex &c2);//声明运算符的"+"函数 
     8   void display();
     9 };
    10 Complex Complex::operator+(Complex &c2)   //在结构体外定义结构体的成员函数用::
    11 {
    12  Complex c;
    13  c.real=real+c2.real;
    14  c.imag=imag+c2.imag;
    15  return c;
    16 }
    17 
    18 void Complex::display()
    19 { cout<<"("<<real<<","<<imag<<"i)"<<endl;}
    20 
    21 istream & operator >>(istream & input,Complex &c)  //重载>>运算符用于输入数据,因结构体里变量是公有成员,不用声明为友元函数,可直接引用成员
    22 {input>>c.real>>c.imag; return input;}
    23 
    24 ostream & operator <<(ostream & output,Complex &c) //重载<<运算符用于输出数据 
    26 {output<<"("<<c.real<<"+"<<c.imag<<"i)"; return output;}
    27 
    28 int main()
    29 {
    30  Complex c1(3,4),c2(5,-10),c3;
    31  c3=c1+c2;
    32  cout<<"c1=";
    33  c1.display();
    34  cout<<"c2=";
    35  c2.display();
    36  cout<<c3;   //和 c3.display();等价
    37   return 0;
    38 }
  • 相关阅读:
    Servlet(简介,请求参数,页面跳转,生命周期,创建,配置,ServletContext,线程)
    zookeeper 集群配置
    centos yum 安装 mariadb
    Oracle jdbc 插入 clob blob
    oracle 删除用户,提示“无法删除当前已连接的用户”
    oracle 创建表空间,用户并授权
    Linux 根分区扩容
    同时运行多个 tomcat 修改端口
    mysql新建用户及授权
    php sql 类似 mybatis 传参
  • 原文地址:https://www.cnblogs.com/jchm/p/5452733.html
Copyright © 2020-2023  润新知