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++ 。 , , 。
, 。
。 , ,
, , ,
。
*/