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了