准备从今天开始好好在牛客网上练习一些题提高代码能力,最近不知道在干些什么,所以想现在开始写总结。
一、函数指针的定义:
C++指向函数的指针定义方式为:
返回类型 (*指针名) (函数参数列表) ,例如 void (*p)(int)是指向一个返回值为void 参数为int类型的函数
例如 : void (*q)(Base,Base)
就是一个返回类型为void,参数列表有两个Base(这里是类名)类的参数
二、运算的一些注意点:
下列程序的输出结果为()。
1
2
3
4
5
6
|
main()
{
int
m=7,n=4;
float
a=38.4,b=6.4,x;
x=m/2+n*a/b+1/2;
printf
(
"%f\n"
,x);
}
例如上面这道题,显示结果为27.000000,原因是m为整型变量,m/2虽然为3.5,但是因为是整型,就取
|
的3。同理1/2位0,所以结果就是27.000000而不是28.000000。
三、内存对齐原则:
一、结构体变量的首地址能够被其最宽基本类型成员大小与对齐基数中的较小者所整除;
二、结构体每个成员相对于结构体首地址的偏移量(offset)都是该成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
三、结构体的总大小为结构体最宽基本类型成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
struct
A
{
int
a;
short
b;
int
c;
char
d;
};
struct
B
{
int
a;
short
b;
char
c;
int
d;
}
|
结构体(struct)(或联合体(union))的数据成员,每个数据成员的对齐按照编译选项指定的数据成员自身长度中,最长的那个。
A:
4(int)+4(short不够4,补2)+4(int)+4(char 不够4,补3) = 16
B:
4(int)+4(char 为1,short为2 ,补1)+4(int) = 12
四、虚函数的应用:
以下程序的输出是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class
Base {
public
:
Base(
int
j): i(j) {}
virtual
~Base() {}
void
func1() {
i *= 10;
func2();
}
int
getValue() {
return
i;
}
protected
:
virtual
void
func2() {
i++;
}
protected
:
int
i;
};
class
Child:
public
Base {
public
:
Child(
int
j): Base(j) {}
void
func1() {
i *= 100;
func2();
}
protected
:
void
func2() {
i += 2;
}
};
int
main() {
Base * pb =
new
Child(1);
pb->func1();
cout << pb->getValue() << endl;
delete
pb; }
|
基类的指针指向派生类的对象
基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数,若不是虚函数,则不管基类指针指向的是哪个派生对象,调用的都是基类中定义的那个函数。
其他也没什么学到的新知识了,主要是不细心,这一点很难受。