C++面试考点

整理一些面试时可能会问到的C++问题和比较基础但容易混淆的问题

++ii++

  • i++ 是先赋值再自加
1
2
3
4
5
6
7
int main(){
int a = 1;
int b = a++; // 先赋值 后自增
cout << a << endl;
cout << b << endl;
system("pause");
}

output

1
2
2
1
  • ++i 是先自加再赋值
1
2
3
4
5
6
7
int main(){
int a = 1;
int b = ++a; // 先自增 后赋值
cout << a << endl;
cout << b << endl;
system("pause");
}

output

1
2
2
2
  • 总结

++i 前面的时候就是先自加,后赋值。

++i 后面的时候就是先赋值,后自加

typedef的三种用法

typedef 在C/C++ 是用来重命名的关键字

1、当你不想用极长的一段代码来定义一个数据类型是,可用此来重新命名,如下:

1
typedef std::map<strCarIndex, STRU_TrafficCarData> MapCarID2CarData

以此方式,后面在遍历查找增加删除等操作时便方便了许多。

1
MapCarID2CarData::iterator it = g_mapCarID2Data.begin();

2、结构体的typedef

在C/C++ 中,特别是C语言中,结构体的定义时typedef非常广泛

1
2
3
4
5
6
7
8
9
typedef struct _CARATTR
{
int m_nColor;
int m_nBrand;
string m_strCarNo;
}CARATTR, *pCARATTR;

CARATTR struCar1;
pCARATTR pStrCar2;

这样定义,则 CARATTR 表示 struct _CARATTR 的一个对象,pCARATTR 表示 CARATTR 的一个指针。但是,这种方式仅限于C语言,C++似乎并不需要这样加一个typedef这样做。

3、函数指针的定义,特别用于回调函数与导出函数。

回调函数,按照我的理解,另一个线程中需要执行的函数或方法,只是函数体的代码实现在本线程中。例如:一个车辆扫描器,一直在循环的工作,查找是否当前范围内有车辆进过。这就是一个线程。当有车辆进过时,在此线程中执行一个动作。这个动作是什么呢?便是我们调用者传过去的一个函数地址。此函数地址指向我们的程序的一个函数。这就是所谓的“函数体的代码实现在本线程中”。

在传入函数地址时,在两个线程中都要定义此函数类型。定义方式如下:

1
typedef typename(*Func)(typename1, typename2, ...);

第一个 typename 是函数返回类型,后面的 typename1typename2 表示函数的参数类型。导出函数的使用方法也是同样的。

参考连接

C/C++ typedef关键字的几种简单用法

C++ 方法名前加~是什么意思?

意思是该函数为析构函数 也就是说 该类对象在生存期结束的时候会自动调用的一个函数

1
2
3
4
class Test{
public:
~Test(){}
}

C++提供构造函数来处理对象的初始化。 1. 构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。 2. 构造函数名字与类名相同,无返回类型。 3. 可以由用户自己定义实现,根据需要设计对数据成员进行初始化,依旧可以设置函数的默认参数。 4. 如果我们没有定义构造函数,系统会为我们自动定义一个无参的默认构造函数的,它不对成员属性做任何操作,如果我们自己定义了构造函数,系统就不会为我们创建默认构造函数了。

系统会默认的提供一个析构函数。在对象的生命周期结束的时候,程序就会自动执行析构函数来完成这些工作。同构造函数,用户可以自己定义析构函数,系统自动调用。 1. 析构函数没有返回值,没有参数; 2. 没有参数,所以不能重载,一个类仅有一个析构函数; 3. 析构函数除了释放工作,还可以做一些用户希望它做的一些工作,比如输出一些信息。