一.new 分配时会调用相应构造函数,malloc不会
同理delete
new T; delete T;
new T[]; delete[] T;
二.static变量属于类本身,不属于任何对象
static函数只能访问static成员
1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 static int s; 8 static void ABC(){cout << 2 << endl;}; 9 }; 10 int A::s = 1; 11 12 int main() 13 { 14 A a, *p = new A(); 15 cout << a.s << endl;//1 16 cout << A::s << endl;//1 17 cout << p->s << endl;//1 18 cout << sizeof(A) << endl;//1 19 20 a.ABC();//2 21 A::ABC();//2 22 p->ABC();//2 23 24 return 0; 25 }
三.this(指向成员函数作用的对象)
this不能作为赋值,递增,递减只有在非static成员函数才有效
static成员函数不具体作用于某个对象,真实的参数个数就是程序中写出的参数个数
1 #include<iostream> 2 using namespace std; 3 4 class C 5 { 6 public: 7 int a; 8 void set(int p); 9 }; 10 void C::set(int p) 11 { 12 a = p; 13 } 14 15 int main() 16 { 17 C c; 18 c.set(200); 19 return 0; 20 } 21 22 等价于 23 struct C 24 { 25 int p; 26 }; 27 28 void set(struct C *this, int p) 29 { 30 this->p = p; 31 } 32 33 int main() 34 { 35 struct C c; 36 set(&c, 200); 37 return 0; 38 }
1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 int i; 7 public: 8 void h() 9 { 10 cout << "1"; 11 } 12 /* 13 void h(A *this) 14 { 15 cout << "1"; 16 } 17 */ 18 void g() 19 { 20 cout << i << "hello"; 21 } 22 /* 23 void g(A *this) 24 { 25 cout << this->i << "hello"; 26 } 27 */ 28 }; 29 30 int main() 31 { 32 A *p = NULL; 33 p->h();//ok, 1 34 //p->g();error,空指针 35 36 return 0; 37 }
四.若函数f中有一个对象参数obj标记为const,则在f中调用obj的任何非const成员都是错误的。
五.成员对象和封闭类
成员对象:一个类的成员变量是另一个类的对象
包含成员对象的类,叫封闭类
定义封闭类的构造函数时,添加初始化列表
1 类名::构造函数(参数表) :成员变量1(参数表), 成员变量2(参数表) 2 { 3 4 }
成员对象初始化列表中的参数:任意复杂的表达式,函数/变量/表达式中的函数,变量有定义
当封闭类对象生成时:执行所有成员对象的构造函数,再执行封闭类的构造函数
成员对象构造函数的调用顺序和成员对现在类中的说明顺序一致,与在初始化列表中出现顺序无关
封闭类对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数
六.对象的内存分配
对象大小=所有成员变量大小之和
一个对象的某个成员变量被改变,不会影响其他对象
1 #include<iostream> 2 using namespace std; 3 4 class CSample 5 { 6 public: 7 CSample() 8 { 9 cout << "1" << endl; 10 } 11 CSample(int n) 12 { 13 cout << "2" << endl; 14 } 15 }; 16 17 int main() 18 { 19 CSample c1[2];//1 1 20 CSample c2[2] = {4, 5};//2 2 21 CSample c3[2] = {3};//2 1 22 CSample *c4 = new CSample[2];//1 1 23 return 0; 24 }
1 #include<iostream> 2 using namespace std; 3 4 class CSample 5 { 6 public: 7 CSample() 8 { 9 cout << "1" << endl; 10 } 11 CSample(int n) 12 { 13 cout << "2" << endl; 14 } 15 CSample(int n, int m) 16 { 17 cout << "3" << endl; 18 } 19 }; 20 21 int main() 22 { 23 CSample c1[3] = {1, CSample(1, 2)};//2 3 1 24 CSample c2[3] = {CSample(1, 2), CSample(3, 4), 1};//3 3 2 25 CSample *c4[3] = {new CSample(4), new CSample(1, 2)};//2 3 26 return 0; 27 }
类中不能定义自身对象,可定义指针对象和引用对象
七.对象大小
空类同样被实例化,每个实例在内存中都有一个独一无二的地址,为达到这个目的
1 class A{}; 2 sizeof(A);//1
1 class A{int a;}; 2 sizeof(A);//4
1 class A 2 { 3 A(int a) 4 { 5 this->a = a; 6 } 7 int a; 8 }; 9 sizeof(A);//4
1 class A 2 { 3 A(int a) 4 { 5 this->a = a; 6 } 7 virtual void x(){}; 8 virtual void y(){}; 9 int a; 10 }; 11 sizeof(A);//8
虚函数表4个字节
sizeof(类)=sizeof(非static成员变量)+4*(有无虚函数?1:0)
1 class A 2 { 3 virtual void x(){}; 4 int a; 5 }; 6 7 class B: public A 8 { 9 int a; 10 }; 11 12 class C: public A, public B 13 { 14 int a; 15 }; 16 17 sizeof(B);//12 18 sizeof(C);//24 sizeof(C) = sizeof(A) + sizeof(B) + sizeof(C)