面试中常见的琐碎知识(二)

1.#pragma once 保证头文件只编译一次,防止头文件的重复包含。#pragma once 这个杂注释与编译器相关的,而不是C/C++ 的基本语法。因此对于不支持#pragma once的编译器建议使用 #ifndef #define #endif

2. Vector中用eraser删除元素只会删除vector容器中的元素,如果容器中是指针,eraser是不会联级地delete指针指向的空间的,因此会造成内存泄露。所以在删除指针元素之前,要判断是否有必要联级地delete指针指向空间的内容(有可能指针指向的也是一个指针,然后指针....最后一个指针才指向一个内存空间),然后再eraservector中的指针。

3.  WM_COMMAND 和其他的消息都一样( WM_LBUTTONDOWN WM_MOUSEMOVE WM_MOUSELEAVE )都是一种单独的消息,只是这个消息是子窗口向父窗口发送的,目的就是交给父窗口去处理。

4. SQL中查找和删除表中的重复数据

查找:select * from table1 where num in (select num from table1 group by num having count(num)>1)

删除:delete from table1 where num in (select num from table1 group by num having count(num)>1)

注意:删除是逐条进行的,每删除一条数据,都会对剩下的数据进行重新分组,重新统计每组的个数。因此当某条数据被删除到只剩一条的时候,在下一次进行分组统计的时候就不会在被删除的集合中了。自然就删除了所有重复的数据。

5. 复制表和拷贝表的SQL

复制表(仅复制表结构,不复制数据)

Select * into B from A where 1=0

拷贝表

Select * into B from A where 1=1//可不写“()”中数据

6. update 一次只能更新一条数据。如下为错:

update table1 set name = (select name from table2 t2 inner join table1 t1 on t2.id = t1.id)

子查询返回的是一个结果集,不是单条数据。 


7.函数指针

  1)声明一个指针数组,该数组有10个元素,每个元素类型是一个有一个int参数且返回值为int的函数指针

  int (*f[10])(int)

  2)声明一个函数指针,该函数指针是一个有两个int参数且返回类型是一个有着一个int参数同时返回一个int的函数指针

  int (*(*f)(int,int))(int) 

8.delete 一个指针后,释放的是指针指向的内存内容,这是指针变成了迷途指针,记得要将该指针指向NULL


9.在C++继承的对象模型中,子类是嵌套基类的成员变量的,但是注意仅仅是成员变量在对应对象的内存空间中,那么成员函数的入口地址存在哪里去了呢?

1)非虚函数:在编译阶段就已经确定,编译器会将对应的成员函数放在一个符号表中,对某个类成员函数的调用就直接转换成对应的汇编语言call 0Xxxxxxx

2)虚函数:有个虚函数表,虚函数原理见:《C++ 虚函数表解析

试举一例:

class C

{

public:

void f();
    private:

int c1;

};

class E

{

   public:

   void f();

   private:

   int e1;

};

class F:public C,public E

{

  public:

  void f();

  private:

  int f1;

};

F的内存对象模型:

  

然后:

F f;

F.f();//call 0xXXXXXXX

F.E::f();//call 0xYYYYYYY

所以编译成汇编语言的时候二者调用的不是同一个内存地址。

10.

63.typeid运算符返回值是type_info(类)的常量对象的引用,有成员函数name()

  例如:int *a[2];

   cout<<typeid(a).name()<<endl;// int * [2]


你可能感兴趣的:(面试中常见的琐碎知识(二))