C++小題(十五)

17282 ワード

/*
      :

#include <iostream>
using namespace std;
 
class A {
    public:
    ~A() {
        cout << "~A()";
    }
};
class B{
    public:
    virtual ~B() {
    cout << "~B()";
}
};
class C: public A, public B {
    public:
    ~C() {
        cout << "~C()";
    }
};
int main() {
    C * c = new C;
    B * b1 = dynamic_cast<B *>(c);
    A * a2 = dynamic_cast<A *>(b1);
    delete a2;
}
     :
    : D       : D (  )

~C()~B()~A()
~C()~A()~B()
A)B)    
     

       c,        ,   B *b1    c,         ,     A *a2    b1,
 delete a2 ,      ,    A          ,     A     ,     :~A()
*/
//////////////////////////////////////////////////////////////////////////////
/*
 x86    ,int a=0xabcd1234 char b=((char*)&a)[0]  b   
    : D       : D (  )

0xa
0x4
0xab
0x34

86     ,         ,        。
int a = 0xabcd1234;
    ab  cd  12   34,b    char,          0x34.
          -->       
*/
//////////////////////////////////////////////////////////////////////////////
/*
        :
    : B       : C (  )

A                   
B              ,        
C       return  ,     void
D    ,               

          ...                   ...                        
*/
//////////////////////////////////////////////////////////////////////////////
/*
struct Date
{
    char a;
    int b;
    int64_t c;
    char d;
};
Date data[2][10];
 32    ,  Data    x,  data[1][5].c    ()
    : C       : C (  )

X+195
X+365
X+368
X+215

         
a               b  c  d
1+(3)+4+8+1+(7)= 24,()              。
&data[1][5].c = x+10*24+5*25+1+(3)+4=368。 
*/
//////////////////////////////////////////////////////////////////////////////
/*
            ( )
    : B       : B (  )

typedef void (*FUN)();
const int &ra;
extern const int array[256];
int* a;

           。     。
*/
//////////////////////////////////////////////////////////////////////////////
/*
         ,           ?

class A {
    public:
        int GetValue() const {
            vv = 1;
            return vv;
         }
    private:
        int vv;
};
    : D       : D (  )

A      "vv" "mutable int vv"
B      "GetValue"   ,     const 
C         
D         

mutalbe      “   ,   ”, constant(  C ++  const)    。 
 C++ ,mutable      const       。 mutable     ,          ,     const   。 
    ,                 ,              const 。
  ,    ,     const                    ,            mutalbe   。
*/
//////////////////////////////////////////////////////////////////////////////
/*
C++           :______。
    : A       : A (  )

a     ,        ,              
b   ,    new/delete              
c      memory leak
d          
e         
f    

 : Windows ,             ,           。
                            ,
 WINDOWS ,     2M(     1M,              ),
                ,    overflow。  ,          。
   
  :             ,         。
                        ,       ,                 。
                       。    ,          ,    。 
*/
//////////////////////////////////////////////////////////////////////////////
/*
         

#define NUMA 10000000
#define NUMB 1000
int a[NUMA], b[NUMB];
  
void pa()
{
    int i, j;
    for(i = 0; i < NUMB; ++i)
        for(j = 0; j < NUMA; ++j)
            ++a[j];
}
void pb()
{
    int i, j;
    for(i = 0; i < NUMA; ++i)
        for(j = 0; j < NUMB; ++j)
            ++b[j];
}

    : C       : B (  )

pa   pb       
pa   pb  
pb   pa  
    

     ,             ,      
        ,          ,                  ,      。
   pb pa ,  a   b   ,       ,            ,  pb 
*/
//////////////////////////////////////////////////////////////////////////////
/*
                ,   ( )  。
    : D       : D (  )

fstream.h
stdlib.h
iostream.h
iomanip.h
*/
//////////////////////////////////////////////////////////////////////////////
/*
        ,3        a(       )、b(         )、c(        ) 3           : 
    : A       : A (  )

abc
acb
cab
cba
*/
//////////////////////////////////////////////////////////////////////////////
/*
      ,       ()

void sca_from_file(int a[], int n, char fn[])
{
    FILE *fp;
    int i;
    fp = fopen(fn, "r");
    for (i = 0; i < n; i++)
    {
        fscanf(fp, "%d", &a[i]);
    }
    fclose(fp);
}

    : A       : A (  )

    fn,      n      a 
    fn,   a n        
    fn,      n,  n      a 
    fn, n   a n          
*/
//////////////////////////////////////////////////////////////////////////////
/*
    typedef char *String_t;  #define String_d char *                 ?
    : C       : C (  )

typedef char *String_t            ,     
#define String_d char *           ,     
           ,          
              ,            String_t a,b; String_d c,d; a,b ,c   char*  , d  char   

*/
//////////////////////////////////////////////////////////////////////////////
/*
    C            :___
    : B       : C (  )

a         
b                        
c                         
d                          

               ,           。
*/
//////////////////////////////////////////////////////////////////////////////
/*
1<<3+2   ()。
32
   +        <<
*/
//////////////////////////////////////////////////////////////////////////////
/*
           ,         :【  】()
class A {
    public:
    virtual void foo() {}
    //…
};

class B {
    public:
    virtual void foo() {}
    //…
};
class C
    : public A
    , public B {
    public:
    virtual void foo() {}
    //…
};

void bar1(A * pa) {
    B * pc = dynamic_cast<B * >(pa);
    //…
}

void bar2(A * pa) {
    B * pc = static_cast<B * >(pa);
    //…
}
void bar3() {
    C c;
    A * pa = & c;
    B * pb = static_cast<B * >(static_cast<C * >(pa));
    //…
}

bar1      
bar2      
bar3      
bar1      ,        cast  

 A、B      ,    static_cast    。
  D  ,     dynamic_cast<>             NULL     。
    dynamic_cast<>        。

C++      dynamic_cast<>         RTTI
1. dynamic_cast<>
dynamic_cast<>  C++         ,  3 :
1.          (Up Cast)
2.          (Down Cast)
3.    (Cross Cast)
                  ,                        ,dynamic_cast            。
           :dynamic_cast   ,                          。
dynamic_cast         (   )cast      ,dynamic_cast                        。
   dynamic_cast          ,dynamic_cast         ,                      , 
dynamic_cast  。         , dynamic_cast      0,          ,     bad_cast  。
  :dynamic_cast    cast    ,         。
  dynamic_cast       RTTI  。               RTTI。
RTTI(Run-Time Type Identification),                                             。
RTTI               :
(1)typeid   ,              。
(2)dynamic_cast   ,                           。
*/
//////////////////////////////////////////////////////////////////////////////
/*
             ?
    : C   

0
3.13e-2.1
.914
2.0*10

            。 C                  。
    
                               ,  0.123、.123、123.、0.0          。
          :                  。
    
                      。    ,            , 2.3026     0.23026×10^1 2.3026×10^0 23.026×10^-1   。
		 C   ,  “e” “E”          “10”      。2.3026     0.23026E1、2.3026e0、23.026e-1。
		C      ,  e E        , e E          。 e3、5e3.6、.e、e          。
		  :   e E               。
                ,             。
		       ,  12、0、-5     。'a''b'     。 4.6、-8.7      。
                     float  、double    long double   。                      。
*/
//////////////////////////////////////////////////////////////////////////////
/*
      ,        

char x[]="abcdefg";
char y[]={'a','b','c','d','e','f','g'};

    : C       : C (  )

  X   Y  
  X   Y    
  X       Y   
  X       Y   

char x[]="abcdefg";             ,C        ,    '\0';
 char y[]={'a','b','c','d','e','f','g'},     ,     ,                  ,            。
*/
//////////////////////////////////////////////////////////////////////////////
/*
          ,    ?
    : A       : A (  )

            
         
                    
                                   

union                 ,    union  
union Test
{
    int a;
    float b;
};
Test test = {1};
test          ,         union         。

*/
//////////////////////////////////////////////////////////////////////////////
/*
           

class packet{
     int size;
     void data[0];
}
  data    ?
    : C   

           
     
         
     
*/
//////////////////////////////////////////////////////////////////////////////
/*
32           :
struct xx
{
    long long _x1;
    char _x2;
    int _x3;
    char _x4[2];
    static int _x5;
};
int xx::_x5;

1
  sizeof(xx)    ()

    : D       : D (  )

19
20
15
24
*/
//////////////////////////////////////////////////////////////////////////////
/*
            ,       :
    : D   

C++           3    throw、try catch  。
            try      ,  throw      。
throw       ,catch              。
  catch    ,      throw      。

A,  ,throw        ,try                ,catch         
B,  ,               try    
C,  ,catch       ,     catch             
D,            
*/
//////////////////////////////////////////////////////////////////////////////
/*
                ?
    : C   

FILE *f = fwrite( "test.bin", "b" );
FILE *f = fopenb( "test.bin", "w" );
FILE *f = fopen( "test.bin", "wb" );
FILE *f = fwriteb( "test.bin" );

             b
*/
//////////////////////////////////////////////////////////////////////////////
/*
                      __________。
    : A   

 
  
   
  
*/
//////////////////////////////////////////////////////////////////////////////
/*
char *p1;int64 *p2;
p1=(char *)0x800000;
p2=(int64 *)0x800000;
char *a=p1+2
int64_t *b=p2+2
  a= 1 ,b= 2 

0x800002
0x800010

//////////////////////////////////////////////////////////////////////////////
/*
      :
1
2
char ch=-1;
printf(“%02x,%02x”,ch,(unsigned char)ch);
   :
    : C  

-1,-1
ff,ff
ffffffff,ff
ff,ffffffff

%02x      2 ,   0.
   ch=-1,     32    1,   ffffffff
           ff(255),      0,      2 ,   ff
*/
//////////////////////////////////////////////////////////////////////////////
/*
     :
1
2
int b;
char c[10];
         ______。
    : B   

scanf("%d%s",&b,&c);
scanf("%d%s",&b,c);
scanf("%d%s",b,c);
scanf("%d%s",b,&c);

*/
//////////////////////////////////////////////////////////////////////////////
/*
In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?

int FindSubString( char* pch )
{
    int   count  = 0;
    char  * p1   = pch;
    while ( *p1 != '\0' )
    {   
        if ( *p1 == p1[1] - 1 )
        {
            p1++;
            count++;
        }else  {
            break;
        }
    }
    int count2 = count;
    while ( *p1 != '\0' )
    {
        if ( *p1 == p1[1] + 1 )
        {
            p1++;
            count2--;
        }else  {
            break;
        }
    }
    if ( count2 == 0 )
        return(count);
    return(0);
}
void ModifyString( char* pText )
{
    char  * p1   = pText;
    char  * p2   = p1;
    while ( *p1 != '\0' )
    {
        int count = FindSubString( p1 );
        if ( count > 0 )
        {
            *p2++ = *p1;
            sprintf( p2, "%i", count );
            while ( *p2 != '\0' )
            {
                p2++;
            }
            p1 += count + count + 1;
        }else  {
            *p2++ = *p1++;
        }
    }
}
void main( void )
{
    char text[32] = "XYBCDCBABABA";
    ModifyString( text );
    printf( text );
}  
    : C   

XYBCDCBABABA
XYBCBCDA1BAA
XYBCDCBA1BAA
XYBCDDBA1BAB

FindSubString    "  !!!"              (  CDC,    BCDCBA  ),  count,
               0
   XYBCDCBABABA              ModifyString    else  , *p2++=*p1++;
    XYBCDCBABABA             ABA,  sprintf    count(   1)  B,         '\0'    A   ,
    while    p2        A   ,p1 += count + count +1 p1      A   B   , p2    
           ,   *p2++=*p1++,  p1    ,                ,               
  ,   XYBCDCB A1 BA A

  
int sprintf( char *buffer, const char *format, [ argument] … );

  :                 。

   stdio.h

    
buffer:char   ,              。
format:      。
[argument]...:    ,          。
   :     (strlen)
*/
//////////////////////////////////////////////////////////////////////////////
/*
         ()
#include<stdio.h>
int main()
{
    uint32_t a = 100;
    while (a > 0)
    {
        --a;
    }
    printf("%d", a);
    return 0;
}


    : C   

-1
100
0
   

Unsigned int      0,       ,a 0     ,    0
*/
//////////////////////////////////////////////////////////////////////////////
/*
         a,b,y         ,      switch   ?
    : A B   

switch(a*a+b*b)
{ default:break;
case3 : y=a+b; break;
case2 : y=a-b; break;
}
switch(a+b)
{ case1 : case3 : y=a+b;break;
case0 : case4 : y=a-b;}
switch(a+9)
{ case a : y=a-b;
case b : y=a+b;
}
switch a*b
{ case 10 : y=a+b;
default : y=a-b;}

C   case a case b   ,case          ;D   ,switch a*b,  
*/
//////////////////////////////////////////////////////////////////////////////
/*
          ()
    : B D   

a       ,        ,         
b         ,           
c                  ,              ,                     ,         
d                                          

              ,A ;
                 ,               ,B ;
               ,                    ,            ,C ;
                     ,D 
*/
//////////////////////////////////////////////////////////////////////////////
/*
      :

char a[] = "xyz", b[] = {'x', 'y', 'z'};
if (strlen(a) > strlen(b))
    printf("a > b
"); else printf("a <= b
"); : : B : B ( ) a>b a<=b release ,strlen(b) , , strlen(b) 6; debug , , strlen(b) */ ////////////////////////////////////////////////////////////////////////////// /* #include<iostream> using namespace std; int main() { char p1[10] = "abcd", *p2, str[10] = "xyz"; p2 = "ABCD"; strcpy(str + 2, strcat(p1 + 2, p2 + 1)); printf(" %s", str); } : D : D ( ) xyabcAB abcABz ABabcz xycdBCD strcat(p1 + 2, p2 + 1) p2+1 "BCD" "cd" "cdBCD"; strcpy(str + 2, "cdBCD"); str +2 "xycdBCD" */ ////////////////////////////////////////////////////////////////////////////// /* () #include<stdio.h> void main() { short *p,*q; short arr[15]={0}; p=q=arr; p++; printf("%d,",p-q); printf("%d,",(char*)p-(char*)q); printf("%d",sizeof(arr)/sizeof(*arr)); } : D : D ( ) 1,0,15 1,2,1 1,1,15 1,2,15 、 , p++ q 2 。 ; 1)p-q=1; 2 , 2 , 1 2)(char *)p-(char *)q, , (char*) , 1 , 2 3) 2 , sizeof(arr) 30,sizeof(*arr) 2。 */ ////////////////////////////////////////////////////////////////////////////// /* #include<stdio.h> main() { int s=0,n; for(n=0; n<4; n++) { switch(n) { default:s+=4; case 1:s+=1; case 2:s+=2; case 3:s+=3; } } printf ("%d
",s); } ? : D : D ( ) 6 18 10 24 for ,n 0, default ,s+=4,s+=1,s+=2,s+=3,s 10。 for ,n 1, s+=1,s+=2,s+=3,s 16。 for ,n 2, s+=2,s+=3,s 21。 for ,n 3, s+=3,s 24。 */ ////////////////////////////////////////////////////////////////////////////// /* , const char str1[] = "abc"; const char str2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc"; () : A : A ( ) str1 str2 ,P1 P2 str1 str2 ,P1 P2 str1 str2 ,P1 P2 str1 str2 ,P1 P2 4 4 str1 str2 , p1 p2 , “abc” , */ ////////////////////////////////////////////////////////////////////////////// /* int b; 1.const int *a = &b; 2.const * int a = &b; 3.const int* const a = &b; 4.int const* const a = &b; int const *a const int *a , , 3、4 const int *a const int, int int *const a const a ,a a , a const int * const a a */ //////////////////////////////////////////////////////////// /* :【 】( ) : A C D : A C D ( ) , , , , , . . 。 , , , 。 : , , , , , , , , C++ 。 , , 。 , 。 。 , , , , , 。 */