每天被面试虐一点点(一)

时间:2023-01-15 14:15:01

1.如果MyClass为一个类,执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是5

        MyClass a[5],会创建5个对象,所以会自动调用5次构造函数,但是MyClass *b[6],这不会自动调用构造函数,因为这是声明一个指向6个元素的数组的指针,指针声明的时候是不分配空间的,所以不会调用构造函数,没有指向一个有效的内存空间。

2.这段代码彻底坑死人了,我在windown64,VC++32可以运行出来,但是就是在linux下的gcc运行不出来,肯定与编译器和环境有关系了,如果在linux下记得在main函数中加入struct st_t st[16],如果要打印结构体大小,请sizeof(struct st_t),不然编译器识别不出来。

struct st_t  
{
  int status;
  short *pdata;
  char errstr[32];
};

st_t st[16];
char *p = (char *)( st[2].errstr + 32 );
printf( "%d", ( p - (char *)(st) ) );

3. void *memset(void *s, int ch, size_t n);  函数解释:将s中前n个字节 (typedef unsigned int size_t )用ch替换并返回s.作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,通常为新申请的内存做初始化工作.刚开始还犯了一个很严重的错误,char *str ="qwertyuioplkjhgfdsaz";常量区不能被修改

#include <stdio.h>
#include <string.h>
int main(int argc,char *argv)
{
char s[] = "Golden Global View";

printf("before %s\n",s);
memset(s,'\0',6);
printf("after %s\n",s);

return 0;
}

4.这段代码只要注意b就好,它修改的不是指针指向的值,而是改变的是指针本身的地址

void foobar(int a, int *b, int **c)
{
int *p = &a;
*p = 101;
*c = b;
b = p;
}

int main()
{
int a = 1;
int b = 2;
int c = 3;
int *p = &c;
foobar(a, &b, &p);
printf("a=%d, b=%d, c=%d, *p=%d\n", a, b, c, *p);
return (0);
}


每天被面试虐一点点(一)


5 另一个基本的c语言问题
unsigned char *p1;
  unsigned long *p2;
  p1=(unsigned char *)0x801000;
  p2=(unsigned long *)0x810000;
  请问p1+5= ; p2+5= ;
就是一个指针加法中1代表什么的问题  1代表的是一个单位量
p1+5=p1+5*1=p1+5*sizeof(unsigned char)=p1+5*1=0x801000+ox5=0x801005
p2+5=p2+5*1=p2+5*sizeof(unsigned long)=p1+5*4=0x810000+20=0x810000+0x14=0x810014


6

class A {
...
private:
int a;
};
class B : public A {
...
private:
int a;
public:
const int b;
A &c;
static const char* d;
B* e;
}

则构造函数中,成员变量一定要通过初始化列表来初始化的是b和c

引用,const成员变量,基类构造函数 一定要通过初始化列表来实现。 static类型不是类成员,不需要通过初始化列表来初始化

7.下列关于虚函数的说法正确的是(CD)

      A在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效在

     B析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效

     C静态函数不可以是虚函数

     D虚函数可以声明为inline

解析:static 成员函数不能声明为虚函数,为什么?不能被重写呗,虚函数是可以被重写的,静态函数是类的,static 成员函数 是属于类的 没有this, 所有类的对象共有virtual 必须有this的感念,根据this的实际 class 来决定如何调用,因为静态成员函数没有this指针,同时其函数的指针存放也不同于一般的成员函数,其无法成为一个对象的虚函数的指针以实现由此带来的动态机制。静态是编译时期就必须确定的,虚函数是运行时期确定的。,inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。虚函数可以声明为inline,但是编译器会忽略inline属性。