zoukankan      html  css  js  c++  java
  • 对象

    一.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)
  • 相关阅读:
    [Poi2000]病毒
    [Zjoi2015]诸神眷顾的幻想乡
    P1663 山
    P1837 单人纸牌
    P6584 重拳出击
    CF460C Present
    10.5 学习笔记
    多项式学习笔记(一) FFT
    NOIP 2020 游记
    uva 经典习题选做(dp专项)
  • 原文地址:https://www.cnblogs.com/wanderingzj/p/5301231.html
Copyright © 2011-2022 走看看