关于struct以及一道面试题

 #include <iostream>
 #include<conio.h>
 
 using namespace std;

 struct structA
 {
     int iMember;
     char *cMember;
 };

 int main(int argc, char* argv[])
 {
     structA instant1,instant2;
     char c = 'a';
   
     instant1.iMember = 1;
     instant1.cMember = &c;
    
     instant2 = instant1;
    
     cout << *(instant1.cMember) << endl;
    
     *(instant2.cMember) = 'b';
    
     cout << *(instant1.cMember) << endl;
    
     getch();
    
     return 0;
}

 

*************************************************************

 

面试题:

#include <iostream>
#include <conio.h>
#pragma pack(8)                                      //一般地,可以通过下面的方法来改变缺省的对界条件:

                            //使用伪指令#pragma  pack (n),编译器将按照n个字节对齐;
                            //使用伪指令#pragma pack (),取消自定义字节对齐方式。

 

using namespace std;

struct example1
{
 short a;
 long b;
};

struct example2
{
 char c;
 example1 struct1;
 short e;   
 };
 #pragma pack()

 int main(int argc, char* argv[])
 {
     example2 struct2;
    
     cout << sizeof(example1) << endl;     //8
     cout << sizeof(example2) << endl;     //16
     cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;   //4
     cout<<(unsigned int)(&struct2.struct1)<<endl;
     cout<<sizeof(struct2.c)<<endl;
     cout<<sizeof(struct2.e)<<endl;
     cout<<sizeof(struct2.struct1)<<endl;
    
     //long l;
     //cout<<sizeof(l)<<endl;                //4
     //short s;
     //cout<<sizeof(s)<<endl;               //2
     //char c;
     //cout<<sizeof(c)<<endl;               //1
    
     getch();

     return 0;
 }

 

很是不理解为什么example2是16,仔细看了那篇文章后发现,struct1为8,然后example1中的最大长度为4,于是example2中的最大长度也要随之为4,很显然这里的#pragma  pack (8)超过了8和4,于是4+8+4为16。还真是挺玄乎的。

(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) 这里要计算的是example2中的第二个元素处于结构体的哪个位置,然后我自己写了句(unsigned int )(&struct2.e) - (unsigned int)(&struct2),结果是意料中的12,当然很简单,就是4+8=12。以上是我自己的理解,下面我把下载的别人的解释贴到下面:

 

 

 

 

程序中第2#pragma pack (8)虽然指定了对界为8,但是由于struct example1中的成员最大size4long变量size4),故struct example1仍然按4字节对界,struct example1size8,即第18行的输出结果;

  struct example2中包含了struct example1,其本身包含的简单数据成员的最大size2short变量e),但是因为其包含了struct example1,而struct example1中的最大成员size4struct example2也应以4对界,#pragma pack (8)中指定的对界对struct example2也不起作用,故19行的输出结果为16

  由于struct example2中的成员以4为单位对界,故其char变量c后应补充3个空,其后才是成员struct1的内存空间,20行的输出结果为4

 

此外,还有一些内容:

C++语言中struct具有了 的功能,其与关键字class的区别在于struct中成员变量和函数的默认访问权限为public,而class的为private

  例如,定义struct类和class类:

struct structA
{
char a;

}
class classB
{
      char a;
      …
}

  则:

struct A a;
a.a = 'a';    //
访问public成员,合法

classB b;
b.a = 'a';    //
访问private成员,不合法

  许多文献写到这里就认为已经给出了C++structclass的全部区别,实则不然,另外一点需要注意的是:

  C++中的struct保持了对Cstruct的全面兼容(这符合C++的初衷——“a better c”),因而,下面的操作是合法的:

//定义struct
struct structA
{
char a;
char b;
int c;
};
structA a = {'a' , 'a' ,1};    // 
定义时直接赋初值

  即struct可以在定义的时候直接以{ }对其成员变量赋初值,而class则不能,在经典书目《thinking C++ 2nd edition》中作者对此点进行了强调。

 

 

 

 

struct编程注意事项

  看看下面的程序:

1. #include <iostream.h>

2. struct structA
3. {
4. int iMember;
5. char *cMember;
6. };

7. int main(int argc, char* argv[])
8. {
9. structA instant1,instant2;
10.char c = 'a';
   
11. instant1.iMember = 1;
12. instant1.cMember = &c;
 
13.instant2 = instant1;
 
14.cout << *(instant1.cMember) << endl;
 
15.*(instant2.cMember) = 'b';
 
16. cout << *(instant1.cMember) << endl;
 
17. return 0;
}

  14行的输出结果是:a
  16行的输出结果是:b

  Why?我们在15行对instant2的修改改变了instant1中成员的值!

  原因在于13行的instant2 = instant1赋值语句采用的是变量逐个拷贝,这使得instant1instant2中的cMember指向了同一片内存,因而对instant2的修改也是对instant1的修改。

  在C语言中,当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2个实例中的指针型成员指向了同一片内存。

  (?)在C++语言中,当结构体中存在指针型成员时,我们需要重写struct的拷贝构造函数并进行“=”操作符重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值