• C++ 结构体初始化


    c++结构体

    1. 构造函数和运算符

    这样没有默认值

    struct node{
     int id;
    node*left;
     node(int a):id(a),left(nullptr){}
    
    };

     这样要注意如下的问题

    node * root=new node(0);
    node * y;
    node* x=root,z;

    //这样会报错 no-matching-function-for-call-to-nodenode; 原因应该是 node* x=root,z;的z被当做了构造函数参数的一部分?

    改成
    node * x=root;
    node* z;就没问题了

    这样有默认值(new的时候可以先不赋值)

    struct Point{
    
    int x,y;
    
    Point (int x=0,int y=0):x(x),y(y){}
    
    };
    
    Point operator + (const Point&A,const Point&B) {   //构造函数
    
    retuen Point(A.X+B.x,A.y+B.y);
    
    }
    
    ostream& operator <<(  //不搞了
    
     
    
     
    
    Point a,b(1,2);
    
    a.x=3;

     template的结构体

    struct Point{
    
    T x,y;
    
    Point (T x=0,T y=0):x(x),y(y){}
    
    };
    
    Point<T> operator + (const Point<T>&A,const Point<T>&B) {   //构造函数
    
    retuen Point<T>(A.X+B.x,A.y+B.y);
    
    }
    
    Point<int>a;

     重载运算符:

    struct ant
    
    {
    
        int id;
    
        int p;
    
        int d;
    
        bool operator <(const ant &a) const {return p<a.p;}
    
    };

     普通的初始化

    struct Person p1 = {"zhangsan",20,170};

    另一种构造

    struct Stu
    
     {
    
      int  nNum;
    
      bool bSex;
    
      char szName[20];
    
      char szEmail[100];
    
     
    
      //构造函数初始化
    
      Stu()
    
      {
    
       nNum = 0;
    
       bSex = false;
    
       memset(szName,0,sizeof(szName));
    
       memset(szEmail,0,sizeof(szEmail));
    
     
    
      }
    
     };

    2.自动赋值

    1.结构体指针,malloc分配空间,不会自动赋值  但是new会。  这里包括指针自动赋值NULL

     (测试发现如果不构造函数初始化为零,那么newmalloc都是随机的;但是初始化后new不随机,malloc仍随机)//也就是上面说的有没有默认值

    所以要注意初始化

    这里的初始化可以是

    struct ss{
    int
    a=0; int b=1; struct ss * next,*be=NULL;
    };

    或者

    ss(int a=0,struct ss * next=NULL):a(a),next(next){} 

    3. 注意何时需要分配内存。

    写入数据才需要。而只是指向地址则不需要。故假设p1 写入了数据,p1new,而p2=p1即可,无需new

     注意free

    4.

    int height(node* root)
    
    {
    
        if(root==NULL)
    
            return 0;
    
        int lh=height(root->next);
    
        int rh=height(root->be);
    
        return (lh>rh)?lh+1:rh+1;
    
    }
    
     
    
    struct ListNode {
    
    int val;
    
    ListNode* next;
    
    ListNode(int x) : val(x), next(NULL) {}
    
    };
    
    ///ListNode* h = new ListNode(0);
    
    ///或 ListNode h(0);
    
    struct node{
    
    int a;
    
    struct node *next,* be;
    
    node(int a=0,struct node * next=NULL,struct node * be=NULL):a(a),next(next),be(be){}
    
    };
    Node a (
    1null,null); node * root=new node; node * root1=(node*)malloc(sizeof(node)); int h=height(root); //h=1,因为是new出来的,root不认为是NULL int h2=height(root1); //出错,因为root是随机的 root1=NULL; int h2=height(root1); h2=0;

    由上,再创立节点以及给其nextNULL,赋值时要小心注意。   

    注意顺序。

    root new了。然后root=NULL。就不要;root->next=new了。

    5.

    还有一个错误。比如 node *p=root

    p=NULL;这样p就和root又无关了。不要用proot

  • 相关阅读:
    net.sf.jsqlparser.statement.select.PlainSelect.getGroupByColumnReferences()Ljava/util/List(版本问题)
    Netty ByteBuf
    Vertx session 使用须知
    用Vert.x shiro jdbcRealm对restful api鉴权
    Vert.x发送 HTTP/HTTPS请求及重定向
    解决“hao123”劫持浏览器主页
    cannot find module bcrypt_lib.node
    nodejs运行项目报错TypeError: db.collection is not a function
    [Java] Stream flatMap
    [Spring Security] Authotization
  • 原文地址:https://www.cnblogs.com/lqerio/p/12115926.html
Copyright © 2020-2023  润新知