zoukankan      html  css  js  c++  java
  • 结构体

    c++不再需要typedef的方式定义一个struct,而且在struct里除了可以有变量(称为成员变量)之外还可以有函数(成员函数),其用法与C++中支持的class差不多。事实上,在C++中struct和class最主要的区别是默认的访问权限和继承方式不同,而其它方面差异很小。

    这里主要讲与算法竞赛可能用上的结构体初始化和运算符重载(大佬请直接忽略)

    结构体初始化

    类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时自动执行,但是它不能被直接调用构造函数的名称与类名一样,并且不会有任何返回类型,也不会返回void。

    析构函数类似,也是一种特殊的成员函数,它会在每次删除所创建的对象时自动执行,析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

    初始化是通过构造函数来实现的,以下4种方法

    1、在结构体中声明,在外面定义

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 struct Point
     6 {
     7     int x, y, w;
     8     Point();                //构造函数声明
     9     Point(int, int, int);    //也是构造函数声明
    10 };
    11 
    12 Point::Point()                //不带参数
    13 {
    14     printf("Create Success
    ");
    15 }
    16 
    17 Point::Point(int _x,int _y,int _w)        //带参数
    18 {
    19     x = _x; y = _y; w = _w;
    20 }
    21 
    22 
    23 int main()
    24 {
    25     Point a;
    26     Point b(2, 3, 4);
    27     
    28     return 0;
    29 }

    2、也可以直接在结构体中写出定义

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 struct Point
     6 {
     7     int x, y, w;
     8     Point(){};            //之前Point();是函数声明,Point(){}这个是函数定义
     9     Point(int _x, int _y, int _w)
    10     {
    11         x = _x; y = _y; w = _w;
    12     }
    13 };
    14 
    15 int main()
    16 {
    17     Point a;                //实际使用了第一种初始化
    18     Point b(1, 2, 3);        //实际使用了第二种初始化
    19     
    20     return 0;
    21 }

    3、定义一个成员函数

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 struct Point
     6 {
     7     int x, y, w;
     8     void  init(int _x,int _y,int _w)
     9     {
    10         x = _x; y = _y; w = _w;
    11     }
    12 };
    13 
    14 int main()
    15 {
    16     Point a;
    17     a.init(1, 2, 3);
    18     
    19     return 0;
    20 }

    4、成员初始化列表,即定义一个有参的构造函数,用成员变量的初始化表对成员变量进行初始化

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 struct Point
     6 {
     7     int x, y, w;
     8     //Point(){};            //下面构造函数中每个参数都设了初始值,就不必Point(){}这个构造函数了
     9     Point(int _x = 0, int _y = 0, int _w = 0) :x(_x), y(_y), w(_w) {};
    10 };
    11 
    12 int main()
    13 {
    14     Point a;                //a为(0,0,0)
    15     Point b(1, 2, 3);        //b为(1,2,3)
    16     
    17     return 0;
    18 }

    acm中一般用方法二和方法四

    运算符重载

    重载的运算符有特殊的函数名,由关键字operator加要重载的运算符构成。与其它函数一样,重载运算符有一个返回类型和参数列表。重载运算符可以被定义成普通的非成员函数或类成员函数。

    如果参数不会被改变,一般用const引用来传递,函数也用const。

    一般情况下,建议一元运算符使用成员函数,二元运算符使用非成员的普通函数。但是如果二元运算符中,第一个操作数为非对象时,必须使用非成员的普通函数。如输入输出运算符<<和>>

    1、使用成员函数

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 struct Point
     7 {
     8     int x, y, w;
     9     Point(int _x = 0, int _y = 0, int _w = 0) :x(_x), y(_y), w(_w) {};
    10     Point operator + (const Point& A)
    11     {
    12         return Point(this->x + A.x, this->y + A.y, this->w + A.w);
    13     }
    14 };
    15 
    16 
    17 
    18 int main()
    19 {
    20     Point a(1,1,1);                //a为(1,1,1)
    21     Point b(1, 2, 3);            //b为(1,2,3)
    22     Point c;
    23     c = a + b;                    //c为(2,3,4)
    24     
    25     return 0;
    26 }

    2、使用普通的非成员函数

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 struct Point
     7 {
     8     int x, y, w;
     9     Point(int _x = 0, int _y = 0, int _w = 0) :x(_x), y(_y), w(_w) {};
    10 };
    11 
    12 Point operator + (const Point& A,const Point& B)    //成员函数只有一个参数(另一个是this),这里有两个
    13 {
    14     return Point(A.x + B.x, A.y + B.y, A.w + B.w);
    15 }
    16 
    17 
    18 int main()
    19 {
    20     Point a(1,1,1);                //a为(1,1,1)
    21     Point b(1, 2, 3);            //b为(1,2,3)
    22     Point c;
    23     c = a + b;                    //c为(2,3,4)
    24     
    25     return 0;
    26 }

    重载"<<"或“>>”这种参数含有非成员变量,必须使用非成员的普通函数。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 struct Point
     7 {
     8     int x, y, w;
     9     Point(int _x = 0, int _y = 0, int _w = 0) :x(_x), y(_y), w(_w) {};
    10     const Point operator + (const Point& p)
    11     {
    12         return Point(this->x + p.x, this->y + p.y, this->w + p.w);
    13     }
    14 };
    15 
    16 ostream& operator << (ostream& out, const Point& a)
    17 {
    18     out << a.x << " " << a.y << " " << a.w;
    19     return out;
    20 }
    21 
    22 
    23 int main()
    24 {
    25     Point a(1,1,1);                //a为(1,1,1)
    26     Point b(1, 2, 3);            //b为(1,2,3)
    27     Point c;
    28     c = a + b;                    //c为(2,3,4)
    29     cout << c;                    //打印出2 3 4
    30     
    31     return 0;
    32 }

     如果是输入,参数值会改变,参数前面不能加const限定词

    1 istream& operator >> (istream& in, Point& a)   
    2 {
    3     in >> a.x >> a.y >> a.w;
    4     return in;
    5 }

    参考链接:

    1、https://blog.csdn.net/andrewgithub/article/details/59477757

    2、https://blog.csdn.net/qq_26822029/article/details/81022227

    3、http://www.runoob.com/cplusplus/cpp-constructor-destructor.html

    4https://www.cnblogs.com/sexybear/p/4551742.html

    5、http://www.runoob.com/cplusplus/cpp-overloading.html

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/lfri/p/10087565.html
Copyright © 2011-2022 走看看