from http://blog.csdn.net/peng825223208/article/details/41484401
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)用基类的对象调用时,执行基类函数。