算法的特性
- 有穷性
一个算法必须保证有限步之后结束
- 确定性
算法中每一条指令必须有确切的含义
- 可行性
算法中所有操作都必须通过已经实现的操作进行运算
- 输入
一个算法有0个或多个输入
- 输出
一个算法有一个或多个输出
定义空类自动生成函数
定义以下类:
class Empty{}
《Effective C++》条款05
声明一个空类之后,编译器就会自动的为他声明一个copy构造函数,一个copy assignment操作符和一个析构函数。
此外如果没有声明任何构造函数,编译器也会自动声明一个default构造函数。所有这些函数都是public且inline的。
class Empty
{
public:
Empty(); //缺省构造函数
Empty(const Empty &rhs); //拷贝构造函数
~Empty(); //析构函数
Empty& operator=(const Empty &rhs); //赋值运算符
Empty* operator&(); //取址运算符
const Empty* operator&() const; //取址运算符(const版本)
};
指针函数
啥啊学编程两年就听说过一次的东西也能成题
data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn);
原题如下:
#include <iostream>
using namespace std;
_______________________
void One(float one)
{
cout<<"1"<<endl;
}
void Two(float two)
{
cout<<"2"<<endl;
}
void Three(float three)
{
cout<<"3"<<endl;
}
int `ain()
{
float i=1,j=2,k=3;
function = One;
function(i);
function= Two;
function(j);
function = Three;
function(k);
}
请为横线处选择合适的程序使得程序的运行结果是123 ( )
A void *function();
B void *function(float);
C void (*function)();
D void (*function)(float);
变量需要内存存放,函数本身也是需要的,存放在代码段中,而函数名字就是函数的地址(和数组类似)
这个题function = 函数名
的语句肯定就是考察函数指针了,所以直接选D,只有它符合函数指针的形式(B为指针函数)
大小端
大端意味着高字节在前,小端意味着低字节在前
具体表达就是,假如说unsigned int a=0x12345678
如果是大端Big-Endian,那么它在内存中是这么存的 12 34 56 78
如果是小端Little-Endian,那么它是这么存的 78 56 34 12
计算机最小寻址单元字节(byte),由8个二进制位(bit)构成,也就是说上述16进制变量是两两一个字节,两两一个位置的,所以如果是小端,那么就是78 56 34 12
判读本机大小端:
int i=0x12345678;
char *p=(char *)&i;
if(*p == 0x78)
printf("小端模式");
else // (*p == 0x12)
printf("大端模式");
为什么呢,因为char类型是一字节大小,int类型的地址被强制转换成char*类型指针,解引用后地址大小就变成char的大小了。int是四个字节,char是一个字节,所以解引用后会得到i的最低字节,如果是0x78,那就说明最低有效字节储存在最低位置处,是小端序,反而是大端序。
现在看题目:
已知 int 占 4 个字节,bool 占 1 个字节。对于下面代码:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
unsigned int value = 1024;
bool condition = *((bool*)(&value));
if (condition) value += 1; condition = *((bool*)(&value));
if (condition) value += 1; condition = *((bool*)(&value));
}
value, condition 的结果为()
注意语句bool condition = *((bool*)(&value));
其实和前文大小端判断的代码类似,将某类型值地址强制转换再解引用,转换后的类型会保存前几个位置的内容,1024转换成十六进制为0x00000400,bool类型占一个字节,无论大端小端,赋值给了condition的都是0,那么两个if就都不执行了。
类继承
class默认为private,struct默认为public
下列程序编译时会出现错误,请根据行号选择错误位置( )
#include <iostream>
using namespace std;
class A{
int a1;
protected:
int a2;
public:
int a3;
};
class B: public A{
int b1;
protected:
int b2;
public:
int b3;
};
class C:private B{
int c1;
protected:
int c2;
public:
int c3;
};
int main(){
B obb;
C obc;
cout<<obb.a1;//1
cout<<obb.a2;//2
cout<<obb.a3;//3
cout<<obc.b1;//4
cout<<obc.b2;//5
cout<<obc.b3;//6
cout<<obc.c3;//7
return 0;
}
- a1没有被设置为public,无法被类外引用——1错
- a2设为protected,允许被子类以及本类的成员函数访问,但类外仍然不能访问——2错
- a3设为public,理应能访问——3对
- C继承B的继承方式是private,所以都没法引用——4,5,6都错
- c3不用说正常的——7对
再附上一张从牛客“偷”来的图