0%

C++基础唐题学习8.9

C++基础唐题学习(8.9)

算法的特性

  • 有穷性

一个算法必须保证有限步之后结束

  • 确定性

算法中每一条指令必须有确切的含义

  • 可行性

算法中所有操作都必须通过已经实现的操作进行运算

  • 输入

一个算法有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对

再附上一张从牛客“偷”来的图