印象笔记公开链接被封
1、默认是私有类型的
2、构造函数调用顺序
基类构造函数 之后成员对象的构造函数 之后派生类的构造函数
下面我们探究一些成员对象在哪里构造的
class C
{
public :
C()
{
printf( "C constructor\n" );
}
};
class A
{
public :
C c;
A():c(new C()){printf( "A
constructor\n" );c = C();};
virtual void foo(){
printf( "Base Class Constructor." );
}
};
int main()
{
A a;
}
显示调用了基类C的构造函数 之后应该是A的构造函数里面有一句 之后A的构造函数里面有C的初始化 所有再次生成对象
class C
{
public :
C()
{
printf( "C constructor\n" );
}
C( int i)
{
printf( "have num %d constructor\n" ,i );
}
};
class A
{
public :
C c;
A():c(123){printf( "A constructor\n" );c
= C ();};
virtual void foo(){
printf( "Base Class Constructor." );
}
};
int main()
{
A a;
}
这个是拿来证明前面那份代码是调用了参数列表的构造函数
总结:
尽量在参数列表初始化成员对象,如果再构造函数中初始化 会浪费时间在 一个成员对象的构造函数和析构函数中 因为在派生类的构造函数中重新赋值会使得之前的对象析构掉
3、union 还有大端小端的问题
union里面的成员共享内存
char数组的0位地址是int的地址向左对齐
union T
{
char s[2];
int a;
};
int main()
{
T t;
t.a=0;
t.s[0]=10;
t.s[1]=1;
printf( "%d\n" ,t.a);
int a=0;
char tmp=10;
memcpy(&(a),&tmp,1);
printf( "%d\n" ,a);
int tInt
= (1<<8)+10;
printf( "%d\n" ,tInt);
}
现在电脑基本是大端
【注】
大端 高位存在低地址 例如int 4字节 byte[0] byte[1] byte[2] byte[3] 地址递增 int 0x12 34 56 78 那么低地址byte[0]存整数的最高位0x12 byte[1]=0x34 byte[2]=0x56 byte[3]=0x78
小端相反
4、引用参数占不占空间???
void test1(int a ,int c )
{
printf( "%d\n" ,&a );
printf( "%d\n" ,&c );
}
void test2(int a ,int & b, int c)
{
printf( "%d\n" ,&a );
//printf("%d\n",&b);
printf( "%d\n" ,&c );
}
int main()
{
int a=0;
printf( "test1:\n" );
test1(1,2);
printf( "test2:\n" );
test2(1,a,2);
}
由图得知占空间
5、虚指针存在哪里??
class A
{
public :
virtual void test(){};
};
int main()
{
A a1;
A a2;
cout<<&a1<<endl;
cout<< sizeof (a1)<<endl;
cout<<&a2<<endl;
cout<< sizeof (a2)<<endl;
}