C/C++基本知识(三)

来源:互联网 发布:程序员工作 编辑:程序博客网 时间:2024/05/05 14:33

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">CList是MFC双向链表类,微软在开发MFC链表类的同时,C++也在开发C++类库。最后C++97版本和VC6.0都是</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">同时推出。</span>

std::list也是双向链表类;std::list是C++类库,在任何操作系统的C++编译器(标准的)都可用,而CList只能在微软操作系统下使用(但是在面试题中常见,适用于教学)。

2、std与STL区别:a)STL:标准模板库    b)std是一个namespace,在使用STL类库中的任何函数或者类都要指定std

list类的构造:int arr[] = {1,2,3,4};

       a)list<int> mylist(arr+1,arr+5)//range constractor空间

            b)list<int> mylist//无参构造 empty constructor也叫默认构造

       c)list<int> yourlist(mylist)//拷贝构造(深拷贝:复制了一份)

       d)list<int> mylist(5,8)//加入5个8在mylist中

3、运算符重载:返回值类型 operator@(const 类名 &obj)

      重载函数:在相同的声明区域内,名字相同,函数参数个数和类型不同的函数

4、递归:自己调用自己(占用栈空间比较多)

5、a)实现两个对象相加的运算符重载

(类)    CTest operator+(const CTest &t)

(全局)CTest operator+(const CTest &t1,const CTest &t2)

b)运算符重载返回值加不加引用,就看返回值是不是临时对象,若是,则不加,否则可以加。

c)不允许重载的运算符:成员访问符(.) 域运算符(::) 长度运算符(sizeof) 条件运算符(?:) 成员指针访问运算符(*)

d)必须把它作为类成员函数的运算符:()、[]、->和、=

6、一些特殊运算符的重载方法

前++--重载:CComplex &operator++(CComplex &c)

++--重载:CComplex &operator++(CComplex &c,int)

如果采用“<<”符号输出一个结构体类型,可以对其进行重载;形如:

void operator<<(ostream &o,SStud &stud){} //o为cout的别名,因为cout也是ostream的对象

7、友元

定义:为私有的成员函数或成员变量开后门。

对函数开后门 friend void Test();//托关系,走后门

对整个类开后门 friend CTest;//这个类用到了另一个类的私有成员。

对类中的某个函数开放:friend void CTest::Test()

使用友元就是为了开放一个权限。

8、如果用到了MFC中的类,要加入afx.h头文件。如CString

9、深拷贝和浅拷贝

a)深拷贝:重新分配自己的堆空间,然后将堆上的数据进行复制

b)浅拷贝:不重新分配堆空间,直接将类内指针指向相同的堆空间

c)浅拷贝对普通结构体就足够了,例如:两个信息结构体对象之间的赋值和构造

d)浅拷贝会出问题,必须用深拷贝的情况,只要是类内有指向堆空间的指针变量,因为堆空间不知道在什么时候就会被释放,这样的话如果是浅拷贝,那么拷贝的东西也就没有了。

10、模板函数:会根据你传入的参数类型建立一个匹配类型的函数。

例如:template<class T>

   T max(T n1,T n2)

    {return n1 > n2 ? n1 : n2;}

标准调用:double d = max<double>(89,91)

标准调用:int a = max(89,91)

16、字符串类的核心算法(拷贝、赋值等等)

17、系统只缺省存在的两种运算:

a)是拷贝构造和operator=赋值,是浅拷贝执行的。

b)由指针到对象自动转换采用的是构造函数

c)由对象到指针的自动转换采用的是类型转换操作符(operator type)

d)构造和赋值的区别是:定义对象时赋值采用的是拷贝构造

对象定义好之后在进行对象之间的赋值采用的是operator=

18、映射类(CMap)是MFC集合类中的一个模板类,也称作字典。

用来开发映射的工具有:哈希表、二叉树。都是非线性的。

Map比线性快就是因为它用哈希。

19、动态数组CArray类的开发与测试

忽略warning语句:#praga warning(disable:4284)

20、std::vector类功能介绍

C++类模板参数总是一个

MFC的模板参数总是两个,有选择参数类型的机会

21、栈CStack类的数据结构。

22、MFC中的类:CList、CArryay、CString中的成员函数的实现

STL中的类:list、vector、string、map中的成员函数的调用。查找、删除功能。

23、memcpy与memmove区别:

a)memmove是memcpy的加强版

b)memmove对两段重叠内存复制出错的问题进行了纠正。纠正代码如下:

if(pDest > pSrc + count || pDest < pSrc){    while(count--)    {        *pDest++ = *pSrc++;    }}else{  pDestc += count;  pSrc     += count;  while(count--)       *--pDest = *--pSrc;}
24、继承和派生就是从一般到特殊的过程,一定要知道继承和派生的构造和析构顺序。

有一些基类的特征是不能被继承下来的:

a)不能使用对象调用构造函数和析构函数

b)无论子类是否定义了构造函数,基类的构造函数都要执行,析构也一样

c)用户重载的new运算符

d)用户重载的=号运算符

e)友元关系:基类的私有仍然开放,派生类中的新增私有成员不能开放

25、a)在派生类中使用初始化列表时,对继承的类进行初始化时,要指定初始化的参数,例如

public C : public A,public B{  C():A(11,22),B(44)  {}}或public C : public A,public B{  C():A(a,b),B(c)  {}}
b)在派生类构造中,如果要向基类送入数据,就必须在基类中有对应的有参的构造函数

c)SStud s1,s2;//类SStud的两个对象s1,s2

  在另一个类SArt的构造中可以这样对两个对象进行初始化:SArt():s1(1008,"战三","m"),s1(1028,"lisi","n"){}

26、重载函数(overload):同一区域内(类内)函数名相同,但是参数列表不同的函数

a)通过参数类型和个数重载

b)返回值类型不能用于重载

重写函数(override):也叫覆盖,覆盖其类的同名函数

a)派生类的函数参数列表和返回值与基类全部相同

b)通过派生类的对象调用时,执行派生类函数

c)用基类的对象调用时,执行基类函数。




0 0
原创粉丝点击