对象

一.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)
原文地址:https://www.cnblogs.com/wanderingzj/p/5301231.html