1、多态中为什么要把父类的析构函数写成虚函数?
虚析构函数,当父类指针或者引用指向子类对象的时候,通常会直接析构父类对象,
而不会析构子类的对象,只有在析构函数前面加上virtual时,就会先析构子类对象,然后再析构父类对象。
虚析构函数是为了避免使用父类指针释放子类对象时造成内存泄露。
2、如果用virtual修饰构造函数会如何?
virtual不能修饰:普通函数、构造函数、 static静态成员函数、inline内联函数
3、explict关键字的用法?什么情况下会使用这个关键字?
什么情况下会使用这个关键字?(在嵌入式当中,如果要读取一些寄存器的值,就要加这个关键字,防止编译器进行优化)
关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。
声明为explicit的构造函数不能在隐式转换中使用。
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。
所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用,使用, 不能作为类型转换操作符被隐含的使用。 呵呵, 看来还是光明正大些比较好。
explicit构造函数的作用
解析:
explicit构造函数是用来防止隐式转换的。请看下面的代码:
class Test1
{
public:
Test1(int n) { num = n; } //普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n) { num = n; } //explicit(显式)构造函数
private:
int num;
};
int main()
{
Test1 t1 = 12; //隐式调用其构造函数, 成功
Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
Test2 t3(12); //显示调用成功
return 0;
}
Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。
普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,Explicit主要是应用于这种情况,避免出现因为隐式转换出现二意性。如下实例说明:
- #include <iostream>
- #include <string>
- class mystring {
- public:
- explicit mystring(const char* p);
- explicit mystring(int n);
- };
- mystring::mystring( const char* p )
- {
- std::cout << p << std::endl;
- }
- mystring::mystring( int n )
- {
- std::cout << n << std::endl;
- }
- int main(int argc, char *argv[], char *env[])
- {
- const char *c = "Hello World!!!";
- int i = 4;
- mystring mystr1 = mystring(c);
- mystring mystr2 = mystring(i);
- // 构造函数加上关键字explicit,下面两句编译都过不去
- // 因为此时这种隐式转换不允许
- // 所以为了避免二意义性,单参数的构造函数建议要加上explicit
- mystring mystr3 = c; // 编译不通过,不允许隐式的转换
- mystring mystr4 = i; // 编译不通过,不允许隐式的转换
- return 0;
- }
4、c++ 在函数后加const是什么意思?
我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。
编程中我们通常写++对象,而不用对象++这是为什么?
前置比后置效率高 ,后置需要构造临时对象并返回,会调用拷贝构造函数,系统的消耗比较大。
5、你用过智能指针吗?和我说说。
智能指针主要用于自动释放内存,防止内存泄漏。
6、你了解设计模式吗?和我说说你都用过哪些?
7、你对网络熟悉吗?TCP/IP
tcp和udp有什么区别?各自有什么应用?
TCP与UDP区别
-
TCP提供的是面向连接的、可靠的数据流传输;
UDP提供的是非面向连接的、不可靠的数据流传输。
-
TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失,不重复,按序到达;UDP尽最大努力交付,即不保证可靠交付。
-
TCP面向字节流;
UDP面向报文。
-
TCP连接只能是点到点的;
UDP支持一对一、一对多、多对一和多对多的交互通信。
-
TCP首部开销20字节;
UDP的首部开销小,只有8个字节。
-
TCP的逻辑通信信道是全双工的可靠信道;
UDP的逻辑通信信道是不可靠信道。
TCP定义
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
UDP定义
UDP (User Datagram Protocol 用户数据报协议)是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。