印象笔记公开链接被封
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;
}