构造、析构、继承对对象的影响

数组

#include <iostream>

#include <string>

#include <vector>

#include <bitset>

 

using namespace std;

 

​class A{

public:

    A(){cout<<"A default constructor"<<endl;}

};

 

int main()

{

    cout<<"------test class-------"<<endl;

    A *a = new A[5]; // will call default constructor to initialization, if no default constructor will raise compile error.

 

    cout<<"------test inner type-----"<<endl;

    int *b = new int [3](); //initialize

 

    for(int i=0; i<3; i++)

    {

        cout<<b[i]<<endl;

    }

 

    cout<<"------test const array------"<<endl;

    const string *c = new const string[2];

    cout<<"str1:"<<c[0]<<endl;

    cout<<"str2:"<<c[1]<<endl;

 

    return 0;

}

 

 

Output:

------test class-------

A default constructor

A default constructor

A default constructor

A default constructor

A default constructor

------test inner type-----

0

0

0

------test const array------

str1:

str2:

 

 

STL

#include <iostream>

#include <string>

#include <vector>

#include <bitset>

 

using namespace std;

 

int main()

{

   cout<<"--------test 1-----------"<<endl;

   vector<int> v(3);

 

   cout<<v.size()<<endl;

   cout<<sizeof(v)<<endl;

 

   for(vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)

   {

       cout<<*iter<<endl;

   }

 

   cout<<"--------test 2-----------"<<endl;

   vector<int> v2(2,10);

   v2.push_back(11);

 

   cout<<v2.size()<<endl;

   cout<<sizeof(v2)<<endl;

 

   for(vector<int>::const_iterator iter = v2.begin(); iter != v2.end(); ++iter)

   {

       cout<<*iter<<endl;

   }

 

   cout<<"--------test bitset------"<<endl;

   bitset<12> a;

   cout<<sizeof(a)<<endl;

   cout<<a.size()<<endl;

   cout<<a<<endl;

 

   a.set(0);

   cout<<a<<endl;

   cout<<a.to_ulong()<<endl;

 

   a.flip();

   cout<<a<<endl;

   cout<<a.to_ulong()<<endl;

 

   return 0;

}

 

Output:

--------test 1-----------

3

24

0

0

0

--------test 2-----------

3

24

10

10

11

--------test bitset------

8

12

000000000000

000000000001

1

111111111110

4094

 

 

#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
class A{
    public:
        A(){cout<<"Constructor A"<<endl;}
        A(A &){cout<<"Copy constructor A"<<endl;}
        A(const A &){cout<<"Copy constructor A"<<endl;} //注意,对于容器,形参必须要有const关键字,否则编译会报错
};
int main(){
    A aa;
    cout<<"------test vector-------"<<endl;
    vector<A> svec(3,aa);    //容器中存放的是元素的copy
    cout<<"------test list-------"<<endl;
    list<A> ilist(3,aa);
}

 

Constructor A
------test vector-------
Copy constructor A
Copy constructor A
Copy constructor A
------test list-------
Copy constructor A
Copy constructor A
Copy constructor A


函数

#include <iostream>

#include <string>

using namespace std;

class A{

public: void f(){cout<<"Hello A"<<endl;}

public:~A(){cout<<"A destruct."<<endl;}

};

 

class B:public A{

public: void f(){cout<<"Hello B"<<endl;}

public: ~B(){cout<<"B destruct."<<endl;}

};

 

 

int main()

{

   A *pa = new B();

   pa->f();   //析构函数不为virtual则不会析构派生类

   delete pa;

 

   return 0;

}

 

Output:

Hello A

A destruct.

#include <iostream>

#include <string>

using namespace std;

class A{

public: virtual void      f(){cout<<"Hello A"<<endl;}

public:~A(){cout<<"A destruct."<<endl;}

};

 

class B:public A{

public: void f(){cout<<"Hello B"<<endl;}

public: ~B(){cout<<"B destruct."<<endl;}

};

 

 

int main()

{

   A *pa = new B();

   pa->f();

   delete pa;

 

   return 0;

}

 

Output:

Hello B

A destruct.

#include <iostream>

#include <string>

using namespace std;

class A{

public: virtual void      f(){cout<<"Hello A"<<endl;}

public: virtual      ~A(){cout<<"A destruct."<<endl;}

};

 

class B:public A{

public: void f(){cout<<"Hello B"<<endl;}

public: ~B(){cout<<"B destruct."<<endl;}

};

 

 

int main()

{

   A *pa = new B();

   pa->f();

   delete pa;

 

   return 0;

}

 

Output:

Hello B

B destruct.

A destruct.

#include <iostream>

#include <string>

using namespace std;

class A{

public: void f(){cout<<"Hello A"<<endl;}

public: ~A(){cout<<"A destruct."<<endl;}

};

 

class B:public A{

public: void f(){cout<<"Hello B"<<endl;}

public: ~B(){cout<<"B destruct."<<endl;}

};

 

 

int main()

{

   B *pa = new B();

   pa->f();

   delete pa;

 

   return 0;

}

 

Output:

Hello B

B destruct.

A destruct.

#include <iostream>

#include <string>

#include <vector>

 

using namespace std;

class A{

public: virtual void f(){cout<<"Hello A"<<endl;}

public: virtual ~A(){cout<<"A destruct."<<endl;}

};

 

class B:virtual public A{

public: void f(){cout<<"Hello B"<<endl;}

public: ~B(){cout<<"B destruct."<<endl;}

};

 

class C:virtual public A{

public: void f(){cout<<"Hello C"<<endl;}

public: ~C(){cout<<"C destruct."<<endl;}

};

 

class D:public B,public C{

public: void f(){cout<<"Hello D"<<endl;}

public: ~D(){cout<<"D destruct."<<endl;}

};

 

int main()

{

   A *pa = new D();

   pa->f();

   delete pa;

 

   return 0;

}

 

Output:

Hello D

D destruct.

C destruct.

B destruct.

A destruct.

#include <iostream>

#include <string>

#include <vector>

 

using namespace std;

class A{

public: virtual void f(){cout<<"Hello A"<<endl;}

public: A(){cout<<"A default constructor"<<endl;}

public: A(const A& a){cout<<"A copy      constructor"<<endl;}

public: A& operator=(const A&a){cout<<"A assignment      constructor"<<endl;}

};

 

class B:virtual public A{

public: void f(){cout<<"Hello B"<<endl;}

public: B(){cout<<"B default constructor"<<endl;}

public: B(const B& a){cout<<"B copy      constructor"<<endl;}

public: B& operator=(const B&a){cout<<"B assignment      constructor"<<endl;}

};

 

class C:virtual public A{

public: void f(){cout<<"Hello C"<<endl;}

public: C(){cout<<"C default constructor"<<endl;}

public: C(const C& a){cout<<"C copy      constructor"<<endl;}

public: C& operator=(const C&a){cout<<"C assignment      constructor"<<endl;}

};

 

class D:public B,public C{

public: void f(){cout<<"Hello D"<<endl;}

public: D(){cout<<"D default constructor"<<endl;}

public: D(const D& a){cout<<"D copy      constructor"<<endl;}

public: D& operator=(const D&a){cout<<"D assignment      constructor"<<endl;}

};

 

void f(D d){}

 

int main()

{

   D a;

   D c;

   c = a;

 

   cout<<"start to call function"<<endl;

   f(a);

   return 0;

}

Output:

A default constructor

B default constructor

C default constructor

D default constructor

A default constructor

B default constructor

C default constructor

D default constructor

D assignment constructor       //赋值函数是不会递归调用的

start to call function

A default constructor

B default constructor

C default constructor

D copy constructor        //拷贝构造函数是不会递归调用的

#include <iostream>

#include <string>

#include <vector>

 

using namespace std;

 

namespace wugk{

   void f();

}

 

namespace wugk{

   void g(){cout<<"namespace g()"<<endl;}

}

 

void f(){cout<<"global f()"<<endl;}

void wugk::f(){cout<<"namespace f()"<<endl;}

 

int main()

{

   f();

   wugk::f();

   wugk::g();

 

   return 0;

}

 

Output:

global f()

namespace f()

namespace g()

#include <iostream>

#include <pthread.h>

#include <stdio.h>

 

class A{

    public:

             //如果没有函数后边的const,则程序编译会报错

             //但如果形参是引用或指针,则可以

        void f(const int a)const{cout<<"const int a"<<endl;}      

        void f(int a){cout<<"int a"<<endl;}

};

int main(){

  A a;

  a.f(1);

 

  const A *b = new A();

  b->f(1);

  return 0;

}

 

Output:

int a

const int a      

#include <iostream>      

#include <pthread.h>

#include <stdio.h>

     

class A{

    public:

        void f(const int& a){cout<<"const int a"<<endl;}

        void f(int &a){cout<<"int a"<<endl;}

};

 

typedef void (A::*PF)(const int &a);

 

int main(){

  PF pl=&A::f;

  A a;

  (a.*pl)(1);

  return 0;

}

 

Output:

const int a      

 

#include <iostream>

#include <pthread.h>

#include <stdio.h>

#include <vector>

using namespace std;

int main(){

    vector<string> vt;

    string s = "123";

    vt.push_back(s);

    vt[0][0]='2';

    vector< vector<string> > vt2;

    vt2.push_back(vt);

    vt2[0][0][0]='3';

    cout<<"string addr:"<<&s<<" str:"<<s<<endl;

    cout<<"vt addr:"<<&(vt[0])<<" str:"<<vt[0]<<endl;

    cout<<"vt2 addr:"<<&(vt2[0][0])<<" str:"<<vt2[0][0]<<endl;

  return 0;

}

 

 

Output://vector 存放的是数据的copy

string addr:0x22ac30 str:123

vt addr:0x20010360 str:223

vt2 addr:0x20010398 str:323

#include <iostream>

#include <pthread.h>

#include <stdio.h>

#include <vector>

using namespace std;

int main(){

    string s1="123";

    string s2=s1+"456";//one new address to store s2

    cout<<"s1 addr:"<<&s1<<" value:"<<s1<<endl;

    cout<<"s2 addr:"<<&s2<<" value:"<<s2<<endl;

    s1=s1+"789";

    cout<<"s1 addr:"<<&s1<<" value:"<<s1<<endl;//address has no change

  return 0;

}

 

Output:

s1 addr:0x22ac40 value:123

s2 addr:0x22ac30 value:123456

s1 addr:0x22ac40 value:123789

 

 

 内存



机器:64SUSE

 

char   1B

short  2B

int     4B

float   4B

double 8B

long         8B

longdouble 16B

指针         8B

机器:32Windows

 

char   1B

short  2B

int     4B

float   4B

double 8B

long         4B

longdouble 12B

指针         4B

class A{     

}; //size: 1

class A{

  public: int i;

};//size: 4


class A{

  public: int i;

  public: short j;

};//size:8


class A{

  public: int i;

  public: short j;

  public: short k;

};//size:8


class A{

  public: short i;

  public: int j;

  public: short k;

};//size:12


class A {

    longdouble i;

    virtualvoid f() {};

}; //size:32


class A {

    int i;

    virtualvoid f(){};

}; //size:16

 


class A{

    staticint i;

};//size:1

class A{

  public: short m;

  public: int k;

  public: long n;

  public: virtual voidf(){};

};//size: 24

 


class A{

  public: short m;

  public: int k;

  public: long doublen;

};//size:32


class B {};

class A:public B{};

//size: B:1  A:1

class B {};

class A:virtual public B{};

//size: B:1  A:8


class B{

public: short i;

};

 

class A:public B{

};

//size: B:2 A:2

 


class B{

public: short i;

};

 

class A:public B{

public: int j;

public: short k;

};

//size: B:2 A:12

       

 

class B{

public: int i;

};

 

class A:virtual public B{

public: int j;

public: short k;

};

//size: B:4 A:24


class B{

public: int i;

public: virtual void f(){};

};

 

class A:virtual public B{

public: int j;

public: short k;

};

//size:A:32, B:16


class C{

public: int j;

};

class B{

public: short i;

};

 

class A:public B,public C{

  public: short k;

};

//size: A:12


 

class C{

public: short j;

};

class B{

public: short i;

};

 

class A:public B,public C{

  public: int k;

};

//size: A:8


 

class C{

public: short j;

};

class B{

public: short i;

};

 

class A:virtual publicB,public C{

  public: int k;

};

//size: A:24B:2C:2

 


 

class C{

public: short j;

};

class B{

public: short i;

};

 

class A:virtual publicB,virtual public C{

  public: int k;

};

//size: A:16B:2C:2


class C{

public: short j;

public: virtual void f(){};

};

class B:virtual public C{

public: int i;

public: virtual void f(){};

};

 

class A:virtual public B{

public: short k;

public: virtual void f(){};

};

//size: A:48, B:32, C:16

 

 


class C{

public: int j;

};

class B:virtual public C{

public: short i;

};

 

class A:virtual public C{

public: short k;

};

 

class D:public A,public B{

public:short m;

};

//size:A:16, B:16, C:4, D:32

A:


 

B:


D:


class E{

public:

    int i;

    virtualvoid f(){};

};

 

class F{

public:

    int j;

    E e;

};

//size: F:24

 

F:


class E{

public:

    int i;

    virtualvoid f(){};

};

 

class F:public E{

public:

    int j;

};

//size: F:16