那些常考的问答面试题(二)

好久没更新了,来更新下加点水文

1什么是虚函数?虚表用来做什么?

虚函数用来表现基类和派生类的成员函数之间的一种关系。

虚函数的定义在基类中进行,在需要定义为虚函数的成员函数的声明前冠以关键字virtual

基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义

在派生类中重新定义时,其函数原型,包括返回类型,函数名,参数个数,参数类型及参数的先后顺序,都必须与基类中的原型完全相同。

虚函数是override的一种表现形式。

2class 与 struct之间的区别

关于使用大括号初始化

class和struct如果定义了构造函数的话,都不能用大括号进行初始化。

如果没有定义构造函数,struct可以用大括号初始化。

如果没用定义构造函数,且所有成员变量全是public的可以用大括号初始化?>?

关于默认访问权限

View Code
class T1
{
 public:
  void f()
  {
   cout<<"T1::f()"<<endl;
  }
 int x,y;
};

struct T2
{
 int x;
 void f(){cout<<"T2::f()"<<endl;}
};


struct TT1 : T1
{
};

class TT2 : T2
{
};

int main()
{
 TT1 t1;
 TT2 t2;
 t1.f();
 t2.f();
}

c++\autodesk\main.cpp||In function 'int main()':|
c++\autodesk\main.cpp|18|error: 'void T2::f()' is inaccessible|
c++\autodesk\main.cpp|35|error: within this context|
c++\autodesk\main.cpp|35|error: 'T2' is not an accessible base of 'TT2'|

写的时候在父类前面加个public就可以解决这个问题

class 中默认的访问权限是private继承,而struct默认是public继承

关于模板

在模板中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是"non-type template parameter",而class 或typename后面跟的是类型参数。

3析构函数的作用是什么?

为了防止资源泄露

例如:

Base *ptr=new Derived;

//..

delete ptr;

如果析构不为virtual,则只会调用derived对象中Base子对象的析构函数

4怎么将成员函数定义为const?

5.What is the Message reflection in MFC?

父窗口将控制子窗口发给它的通知消息,首先反射回子窗口进行处理(即给控制子窗口一个机会,让控制子窗口处理此消息),这样通知消息就有机会能被子窗口自身进行处理。

6.列出两个情况是必须使用成员初始化列表,而不在构造函数里面赋值

class Base{Base(int a);//..}; class Derived{Derived(int a) : Base(a){};//...};

为什么使用成员初始化列表:

一个原因是必须的,另一个只是出于效率考虑。
  让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。
  class CMember {
  public:
   CMember(int x) { ... }
  };
  因为Cmember有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建Cmember的一个实例。
  CMember* pm = new CMember; // Error!!
  CMember* pm = new CMember(2); // OK
  如果Cmember是另一个类的成员,你怎样初始化它呢?你必须使用成员初始化列表。
  class CMyClass {
   CMember m_member;
  public:
   CMyClass();
  };
  //必须使用成员初始化列表
  CMyClass::CMyClass() : m_member(2)
  {
  •••
  }
  没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。

7.#define DOUBLE(x) x+x

i = 5 * DOUBLE(10)
这个时候i是什么结果?60 define 是宏 在编译的时候是要展开来的
正确的DOUBLE应该怎样写?

#define DOUBLE(x) ((x)+(x))

8.static_cast和dynamic_cast有什么区别?

1)。dynamic_cast:运行时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用。
2)。static_cast:编译时检查,用于非多态的转换,可以转换指针及其他,比如:int->float还可以逆隐式转换,比如:int->char。It is left to the programmer to ensure that the results of a static_cast conversion are safe.

9namespace解决了什么问题?

名字冲突

10.auto_ptr是什么东西,有什么用?

智能指针,主要是用来自动管理指针所指向的内存(memory)资源

1)所有权概念:不要让两个auto_ptr对于拥有空闲存储区内同一对象的所有权

2)不能用一个指向"内存不是通过应用new表达式分配的"指针来初始化或者赋值auto_ptr

11.1. 写出三个你熟悉的排序法,以时间复杂度的大小排序
2, 写出一个使用递归来反转一个单向链表的函数
3, 写一个程序测试系统是Big_Endian的还是Little_Endian的(以前万老师发帖讨论过了)

联合体union

int checkEndian(){union w{int a;char b;}c;c.a = 1;return (c.b == 1);}

 

12. C++有管理多种内存,分别写出他们是什么,他们的特性和性能如何?

静态存储

13.写出一个基于char*的string类,包括构造析构函数和赋值运算符,取字串长度等基本操作

14.IQ
1, 称面粉(经典题)
2, 在平面上有一系列间距为2的无限长的平行线,在上面扔单位长度的线段,和平行线相交的概率是多少?
3, A君和B君见到B君的三个熟人X,Y,Z
A君问B君:“他们的多大”
B君说:“他们的年龄之和是我们的年龄之和,他们的年龄的乘积是2450”
A说:“我还是不知道”
B说:“他们都比我们的朋友C要小”
A说:“那我知道了”
问C的年龄是多少?

15

1, 怎么为窗口自定义消息

Windows 应用程序所要做的每项工作几乎都是基于消息处理的, Windows 系统消息分为常用 Windows 消息,控件通知消息和命令。然而,有时我们需要定义自己的消息来通知程序什么事情发生了,这就是用户自定义消息
2, SendMessage和PostMessage的区别

PostMessage 是异步的,SendMessage 是同步的。
PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。


3, CRuntimeClass是由什么用的?他是怎样得到的?

MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例


4, 怎样通过一个句柄得到CWnd的指针

直接转换CWnd*   wnd=(CWnd   *)handle;   
或   
用FromHandle();   
或   
Attach()函数  

16.

甲,乙,丙,丁是亲缘关系,他们之间没有违反伦理道德的问题。1)其中一个与其他三个性别不同。2)在这四个人中,有甲的母亲,乙的哥哥,丙的父亲,丁的女儿。3)最年长的和最年轻的性别不同。
问:谁与其他三个性别不同?

答案:丁

一天,A君和B君一起在路上走着,遇见B君的三个熟人 X,Y,Z。A君问起B君:“他们三个人今年多大?”B君想了想说:“那我就考考你吧:他们三人的年龄之和为我们两人年龄之和,他们三人的年龄相乘等于2450。”A君算了算说:“我还是不知道!”B君听后笑了笑说:“喔!那我再给你一个条件--他们三人的年龄都比我们的朋友C君要小。”A君听后说:“喔!那我知道了。”
最后问C君的年龄是多少?25<C<=35

x y z

7 14 25

17.

 分析一下这段程序的输出 (Autodesk)

class B{public:B(){cout<<"default constructor"<<endl;} ~B(){cout<<"destructed"<<endl;} B(int i) : data(i) //B(int) works as a converter ( int -> instance of B){cout<<"constructed by parameter " << data <<endl;} private:int data;}; B Play( B b){return b ;} (1) results:int main(int argc, char* argv[]) //constructed by parameter 5{ //destructed B(5)形参析构B t1 = Play(5); B t2 = Play(t1);   //destructed t1形参析构return 0;               //destructed t2 注意顺序!} //destructed t1 (2) results:int main(int argc, char* argv[]) //constructed by parameter 5{ //destructed B(5)形参析构B t1 = Play(5); B t2 = Play(10); //constructed by parameter 10return 0;               //destructed B(10)形参析构} //destructed t2 注意顺序!//destructed t1

18.

 写一个函数找出一个整数数组中,第二大的数(microsoft)
答案:
下面是一个O(n)算法

const int MINNUMBER = -32767 ;int find_sec_max( int data[] , int count){int maxnumber = data[0] ;int sec_max = MINNUMBER ;for ( int i = 1 ; i < count ; i++){if ( data[i] > maxnumber ){sec_max = maxnumber ;maxnumber = data[i] ;}else{if ( data[i] > sec_max )sec_max = data[i] ;}}return sec_max ;}

但是如果要求第n大的数,可能整个算法就无能为力了

一种求第n大的算法是,借助于快速排序的思想,对其进行改进

19.写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。

KMP算法效率最好,时间复杂度是O(n+m)。

20.如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)


   struct node { char val; node* next;}
   bool check(const node* head) {} //return false : 无环;true: 有环

一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
bool check(const node* head)
{
    if(head==NULL) return false;
    node *low=head, *fast=head->next;
    while(fast!=NULL && fast->next!=NULL)
    {
        low=low->next;
        fast=fast->next->next;
        if(low==fast) return true;
    }
    return false;
}

21.1.STL中container有哪些?
答:vector,list,set,multiset,map,multimap,deque,bitset
2.map中的数据存储方式是什么?
答:Hashtable
3.map和hashmap有什么区别?
答:不知道。
4.hashmap是标准库中的吗?
答:不是。
5.vector中的erase方法跟algorithm的remove有什么区别?
答:我不怎么清楚,只知道remove_if可以用function object。还有可能vector自带的erase在执行过后会有一些优化的方法吧。
6.function object是什么?
答:(这个我说了半天,反正就是描述一下)

1. C++中如何阻止一个类被实例化?
   答:抽象类,或者构造函数被声明成private
2. 一般在什么时候构造函数被声明成private呢?
   答:比如要阻止编译器生成默认的copy constructor
3. 什么时候编译器会生成默认的copy constructor呢?
   答:只要自己没写,而程序中需要,都会生成
4. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?
   答:会
5. struct和class有什么区别?
   答:默认的访问级别不同,struct是public,class是private
6. 没有别的不同了吗?
   答:好像没有了吧……
7. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?
   答:(Effective C++ 条款14,我当时刚刚复习过,呵呵)
8. inline的函数和#define有什么区别?
   答:类型检查
9. inline是什么意思?
   答:就是不产生call,直接把函数的代码嵌入程序。但是inline不是强制的,是
编译器根据需要决定函数是否真的被inline
10. 那你说说什么时候会真的被inline,什么时候不会呢?
   答:(略)
11. 如果把一个类的成员函数写在类的声明中是什么意思?
   答:inline
12. public继承和private继承有什么架构上的区别?
   答:public是is-a的关系,private是has-a的关系
13. 在多继承的时候,如果一个类继承同时继承自class A和class B,而class A和
B中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()?
   答:虚拟继承吧……(我想了半天也不记得这个怎么弄了,他也就没有继续难为
我)
14. 虚拟继承的语法是什么?
   答:class C : public A, virtual public B
15. 部分模版特例化(我忘了他当时怎么翻译这个词的了,反正就是partial temp
late specialization)和全部模版特例化有什么区别?
   答:(想了半天)就是是不是还有一个通用的模版的区别。这个特性在VC中不支
持,所以我不是很熟悉,不好意思……
16. 哦?VC不支持?你确定
   答:确定!(.net刚出的时候,我特意看过MSDN,上面写着VC7.0中有3个C++的
特性没有支持,其中就有这个,没想到他连这个都考!)
……
剩下的忘了,想起来再添吧

1.编一个函数,使一个单项链表转置。 
2.拆解一个整数,比如4,可以拆解成 
4=3+1 
4=2+2 
4=2+1+1 
4=1+1+1+1 
3.哈希表 
4.不用库函数,实现strcpy或者memcpy等函数

22.1在类的普通成员函数中调用虚函数,情况是怎么样的?(对象、引用、指针)

多态, 事实上,这是 Template Method模式的关键

 2关于成员变量初始化顺序,几个有依赖关系的成员变量要初始化,让写出构造函数。

在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。

3. 写一个双链表。 

Struct ListNode

{

    int nData;

    ListNode* pPreviousNode;

    ListNode* pNextNode;

}

一般链表都会有一个表头节点与指向表头节点的头指针, 应该会提供列表接口, 按此数据结构实现即可。

4. 写个is-a和has-a。

这个比较简单

Class Pet{};

Class Dog: public Pet{};

Class Boy{Pet* m_pPet;};

5. stl 里面vector的实现(内部空间的申请与分配)

Vector中文名字是动态数组, 其内部数据结构就是一个数组, 但是在数组元素不够用的时候,就要动态的重新分配, 一般是现在大小的两倍, 然后把原数组的内容拷贝过去。所5以, 在一般情况下, 其访问速度同一般数组, 只有在重新分配发生时, 其性能才会下降

6. 为什么要用struct

成员的默认属性不同,用struct的话,主要是作为数据的集合。

7.怎样使一个class不能被实例化

1,构造函数私有化,2,抽象类

因为构造函数被class私有化了,所以我们要创建出对象,就必须能够访问到class的私有域;但这一点“我们”是做不到的,那么,谁能做得到呢?class的成员可以做得到;但在我们建构出其对象之前,怎么能利用它的成员呢?噢,刚才我们刚刚提到了static公有成员,它是独立于class对象而存在的,当然,它也是公有的,“我们”可以访问得到。假如在某个static函数中创建了该class的对象,并以引用或者指针的形式将其返回(不可以以值的形式返回,想想为什么),我们就获得了这个对象的使用权。

View Code
 1 class WonderfulClass
 2 {
 3 public:
 4        static WonderfulClass* makeAnObject()
 5        {
 6               // 创建一个WonderfulClass对象并返回其指针
 7 
 8               return (new WonderfulClass);
 9        }
10 private:
11        WonderfulClass() { }
12 };
13 
14 
15 int main()
16 {
17        WonderfulClass *p = WonderfulClass::makeAnObject();
18 
19        ... // 使用*p
20 
21 
22        delete p;  // Not neccesary here, but it's a good habit.
23 
24        return 0;
25 }

 makeAnObject()作为WonderfulClass的静态成员函数,尽心尽责地为我们创建对象:由于要跨函数传递并且不能使用值传递方式,所以我们选择在堆上创建对象,这样即使makeAnObject()退出,对象也不会随之蒸发掉,当然,使用完之后你可不要忘了手工将它清除。除了公有的static成员可以帮助我们访问私有域外,还有没有其它可以利用的“东西”?

可以使用该类的友元函数或者友元类创建其对象。

 

 8私有继承和public继承的区别。

私有继承: 只继承实现,不继承实现 has-a

公有继承:继承接口与实现    is-a

共有继承:
1 共有继承不改变基类成员在派生类中的访问权限。在共有继承下,基类的public成员,protect成员,private成员在派生类中保持它们在基类中相同的访问权限。
2 在派生类中定义的成员函数不能直接访问基类的私有成员,只能通过public或protect成员函数访问。
私有继承:
1 基类的private和protect都在派生类中变成了private成员,不能被派生类的外部函数访问。
2 派生类的成员函数不能访问基类的private成员,但可以访问基类的public和protect成员,并通过它们访问基类private成员。

9void *p的问题

不能做指针算术运算,例如不能++

10.引用和指针的区别与联系。引用是否可以更改

联系: 支持多态,可以用来引用同一对象

区别:指针可以为NULL, 引用不可以; 指针可以重赋值, 引用不可以;

11.windows编程基础,线程与进程的区别

程序是一系列静态的指令序列

进程是程序的一次动态执行,进程其实是一个资源的容器,包括一个私有的虚拟地址空间,一些初始的代码与数据, 一些系统资源的句柄等

线程是一个进程中的执行体, 一般包括CPU寄存器状态,两个栈(内核模式,用户模式)以及一个TLS(Thread-Local Storage)等

12.com+是否熟悉

COM+是COM技术的延伸与发展, 它包括了所有COM的基本功能(基于接口的编程模型,基本组件服务),并组合了DCOM(使组件技术延伸到了分布式领域)和MTS-Microsoft Transaction Server(提供了服务器端的组件管理与配置管理),并新增了一些服务:负载平衡,内存数据库,事件模型,队列服务等,主要用于Windows DNA(Distributed interNet Application Architecture)三层结构的中间层。

13.简述一下hash算法

哈希表的目的是表查询插入修改能够达到O(1)的算法复杂度, 通过对key编码来确定其存储地址来实现, 当不同的key得到相同的编码时,便需要进行冲突检测与处理,一般方法有除留余数法, 线性探测法,平方探测法,这使其无法真正达到O(1)

14.一个32位的数据,怎样找到最左边的一个1?

如果是在最左位,这个数是负数,否则的话,左移一位,看是否变成负数,这是O(n)的算法, 也可以用一个模板去与,并不断改变这个模板

O(n/2)的算法:二分方式查找 ???

15.一个4*4的格子,填入1~15 然后给个目标状态,怎样去搜索。

比如:
 1   2  3    6
 0   4  5    7
 8   9  10   11
 12  13 14   14

再给出个最终的状态 (随便都可以)
0 表示一个空格,可以移动,有点像拼图;
 

人工智能的教材上用的应该就是这个例子,用A*算法,它既不是广度搜索,也不是深度搜索,而是一种启发式搜索,在进行下一步搜索之前,会用一个估价函数来对后面的节点评分, 取评分最优的进行下一步搜索,如果找不到结果,回溯。对于本题,用曼哈顿距离作为评分标准是个不错的选择。

16.给你100万个数据,数据的值在0~65535之间 用最快的速度排序

多关键字基数排序MSD(MOST SIGNIFICANT DIGIT FIRST)

17.八皇后问题,详述解法 (八皇后问题说的是在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突)

回溯法

18.kmp快速匹配算法 ---不算轻松的搞定

普通的模式匹配算法,一旦不匹配,模式串右移一位;但是其实根据一直条件,我们可以算出应该向右移几位以避免不必要的比较;算法实现比较曲折

19.无向图中两点间最短路问题 ---伟大的迪杰克斯拉算法

假设一共有N个节点, 需要一个一维数组Previous[N]来记录前一个节点序号;一个一维数组TotalLength[N]来记录从原点到当前节点最短路径;一个二维数组Weights[N][N]来记录各点之间边的权重(如果存在), 然后从源点到终点进行深度搜索或广度搜索, 按以下规则:搜索到某个节点b时,假设其前一个节点为a,把TotalLength[a] + Weights[a][b]与TotalLength[b]相比较,如果小于TotalLength[b], 则TotalLength[b] = TotalLength[a] + Weights[a][b], Previous[b] = a; 反之则不做任何操作。这样到搜索结束后,从Previous[N]数组中就能得到整条最短路径了

20.空间中任意给两个向量,求角平分线

先单位化, 假设单位化后结果为nv1, nv2, 则角平分线为(nv1+nv2) / 2

21.什么是平衡树

左右子树都是平衡树,且高度相差不超过1的有序二叉树

22.哈夫曼编码问题

理论基础:霍夫曼树是带权路径长度(WPL:Weighted Path Length)最小的二叉树,它不一定是完全二叉树,应该是权值大的外结点离根节点最近的扩充二叉树。霍夫曼编码是为了实现数据的最小冗余编码,是数据压缩学的基础。 它根据字符在电文中出现的频率为权值,构造霍夫曼树,左为0, 右为1. 其有两个效果,一是保证电文有最短的编码,二是字符间不需要分隔符,因为不同的字符必定有不同的开头(成为前缀编码)。

23.有向图求环

以该节点为源点与终点吗进行深度优先或广度优先搜索

24.给n个点,求凸包问题

凸包(convex hull)是指一个最小凸多边形,满足这N个点都在多边形上,或其内。算法描述:

求出最右的那个点作为凸多边形的一个顶点(P0),遍历其他所有点(Pi), 如果其他点都在向量P0Pi的同一侧,则Pi也为凸多边形的顶点

25.四则运算(给一个前缀表达式(波兰式)或后缀表达式(逆波兰式),然后求解;给一个中缀表达式)

+*-CDBA -/EF---------------------> A+B*(C-D)-E/F       前缀-中缀

操作符进栈,一个变量tmp放上一个中间操作数(运算结果),遇到操作数检查tmp是否为空, 空的话取两个操作数,不空的话取一个操作数,另一个就是tmp了,操作符出栈运算,结果放入tmp中,如果是操作符,tmp清空

 ABCD-*+EF/- ---------------------> A+B*(C-D)-E/F     后缀-中缀

操作数进栈,遇到操作符,两个操作数出栈,计算结果入栈

26. STL中container有哪些?

序列容器: vector, list, deque, bitset

关联容器:  set, multiset, map, multimap

适配容器:stack, queue, priority_queue

类容器:  string, valarray, bitset

扩展容器:hash_set, hash_multiset, hash_map, hash_multimap

27. map中的数据存储方式是什么?

红黑树, 是一种平衡二叉搜索树, 具有良好的最坏情况运行时间(统计性能好与AVL树)

28. map和hashmap有什么区别?

内部数据结构不同, map是红黑树,hashmap是哈希表

29. hashmap是标准库中的吗?

不是的,但在SGI stl与vc2005中都提供了。

30. vector中的erase方法跟algorithm的remove有什么区别?

vector中erase是真正删除了元素, 迭代器访问不到了。 algorithm中的remove只是简单的把要remove的元素移到了容器最后面,迭代器还是可以访问到的。因为algorithm通过迭代器操作,不知道容器的内部结构,所以无法做到真正删除。

31. object是什么?

具有内部状态,以及操作的 软件构造,用来表示真实存在(物理上或概念上)的对象

32. C++中如何阻止一个类被实例化?

纯虚函数;构造函数私有化(友元)

33. 一般在什么时候构造函数被声明成private呢?

 singleton单件模式; 阻止某些操作(如阻止拷贝构造)

34. 什么时候编译器会生成默认的copy constructor呢?

用户没有自定义copy constructor;在代码中使用到了copy constructor;

35. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?

如果我写的是copy constructor, 不会

如果我写的不是copy constructor, 同34

36. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?

因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。 当然,另一种做法是将基类析构函数设为protected.

37. inline的函数和#define有什么区别?什么时候会真的被inline,什么时候不会呢?

1) 宏是在预编译阶段简单文本替代, inline在编译阶段实现展开

2)宏肯定会被替代,而复杂的inline函数不会被展开

3)宏容易出错(运算顺序),且难以被调试,inline不会

4)宏不是类型安全,而inline是类型安全的,会提供参数与返回值的类型检查

当出现以下情况时inline失败

函数size太大

inline虚函数

函数中存在循环或递归

函数调用其他inline函数

38. 如果把一个类的成员函数写在类的声明中是什么意思?

inline此函数 (inline与template类似, 必须在.h中实现)

39. public继承和private继承有什么架构上的区别?

public是is-a的关系,继承接口与实现

private是has-a的关系 ,只继承实现

40. 在多继承的时候,如果一个类继承同时继承自class A和class B,而class A和B中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()?

首先,foo在A,B总应该都是虚函数,否则就直接覆盖了,就没有这个问题了;其次,这个问题从语法角度来看似乎是无法解决。因为我们不能改原有设计(不然也没这个问题了:)),所有只好从extend来考虑:

class EA: public class A

{

public:

   virtual void foo(){fooA();}

private:

   virtual void fooA() = 0;

}

 

class EB: public class B

{

public:

   virtual void foo(){fooB();}

private:

   virtual void fooB() = 0;

}

 

这样, 我就可以override不同的函数来达到这个目的了

class AB: public EA, pubic EB

{

private:

virtual void fooA(){}

virtual void fooB(){}

}

41. 虚拟继承的语法是什么?

    A

 /     \

B      C

   \ /

    D

class A{};

class B: virtual public A{};

class C: virtual public A{};

class D: public B, public C{};

42. 部分模版特例化和全部模版特例化有什么区别?

偏特化只使用于类模板,而全特化适用与函数模板,类模板。

偏特化的结果还是一个模板,而全特化的结果是一个具体的类型。

43. 编一个函数,使一个单项链表转置。

应该是逆序吧

这个小算法竟然花了我不少时间,没有测试过的:

struct  ListNode
{
    int
 data;
    ListNode*
 next;
};

void ReverseList(ListNode*
 p)
{
    ListNode* p0 =
 NULL;
    ListNode* p1 = p->
next;
    ListNode* p2 = p1 ? p1->
next : NULL;

    //
 三个指针,分别表示当前处理节点,前一节点与后一节点
    // 复用头节点的next来保存节点

    while (NULL !=  p2)
    {
        p->next = p2->next; //暂存


        p1 ->next = p0;      //逆转
        p2->next =  p1;

        p0 = p1;            //往下一个节点

        p1 =  p2;
        p2 = p->
next;
    }
    p->next = p1;    //p1末元素变为首元素,链到头节点上

}

转载于:https://www.cnblogs.com/bertrandwdx/archive/2013/01/15/2861403.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值