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
(测试发现如果不构造函数初始化为零,那么new,malloc都是随机的;但是初始化后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 写入了数据,p1要new,而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 (1,null,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;
由上,再创立节点以及给其next赋NULL,赋值时要小心注意。
注意顺序。
root new了。然后root=NULL。就不要;再root->next=new了。
5.
还有一个错误。比如 node *p=root;
p=NULL;这样p就和root又无关了。不要用p赋root了