【C++杂谈0】记录一些我容易犯错的C++细节

本文详细解析了C++中构造函数的调用顺序、参数列表初始化成员对象的重要性、union与大端小端问题、引用参数占用空间的讨论以及虚指针的存在位置等关键概念。通过具体代码实例,深入探讨了构造函数、初始化过程及内存布局的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

印象笔记公开链接被封

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值