鼎桥通信C++面经
类与结构体的区别
默认的访问权限:
(1)C++结构体内部成员变量及成员函数默认的访问级别是public,而c++类的内部成员变量及成员函数的默认访问级别是private。
(2) C++结构体的继承默认是public,而C++类的继承默认是private。
引用和指针
引用是一个变量的别名,不能为空,必须在声明的时候初始化,而且之后不能修改为其他的变量的别名;
指针的值是一块内存的地址,可以为空,可以先声明后初始化,后面可以修改其指向的内存地址。
析构函数 虚析构函数
- 析构函数
~Date()
{
cout << "~Date()" << this << endl;
}
private:
析构函数是在对象消亡的时候调用,用于回收内存。如果没有自行定义析构函数,编译器会生成一个默认的析构函数,函数体执行结束的时候会自动调用析构函数。
如果是用new定义了一个在堆上的对象 A *p=new A; 那么必须使用delete p; 才会调用析构函数回收内存。
- 虚析构函数
https://www.cnblogs.com/liushui-sky/p/5824919.html
https://blog.csdn.net/xld_hung/article/details/76776497
虚析构函数一般指的是将基类的析构函数声明为虚函数,在定义一个基类指针,其指向对象是一个派生类的时候,通过动态绑定实现在运行的时候确定该指针的指向是派生类,从而在删除对象的时候调用派生类的析构函数,防止内存泄漏。
#include <iostream>
using namespace std;
class Base
{
private:
int i;
public:
Base()
{
cout << "Base count " << endl;
}
virtual ~Base()
{
cout << "Base descount" << endl;
}
};
class Inherit :public Base
{
private:
int num;
public:
Inherit()
{
cout << "Inherit count" << endl;
}
~Inherit()
{
cout << "Inherit descout" << endl;
}
};
int main()
{
Base *p;
p = new Inherit;
delete p;
return 0;
}
上面的代码我将指针的声明和初始化拆开成两行,调试的时候发现声明的时候并没有调用基类的构造函数,在初始化的时候一次性调用了基类和派生类的构造函数,而delete p的时候就调用了派生类和基类的析构函数。有点蒙圈,哪位大佬可以帮我解释一下?
运行结果:
Base count
Inherit count
Inherit descout
Base descount
线程与进程 多线程
https://www.cnblogs.com/fuchongjundream/p/3829508.html
进程是分配资源的基本单位,线程是独立运行和独立调度的基本单位。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
指针常量 常量指针
int const*p; 等价于 const int *p; 都表示指针p指向的是一个常量
int *const p; 表示指针p是一个常量,不能更改指向
静态变量,静态函数
https://www.cnblogs.com/secondtonone1/p/5694436.html
https://www.cnblogs.com/ppgeneve/p/5091794.html
- 静态局部变量和静态全局变量
静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序结束都一直存在,即它的生命周期是程序运行就存在,程序结束就结束,
静态全局变量具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。 - 类的静态成员变量和静态成员函数
静态成员变量和静态成员函数主要是为了解决多个对象数据共享的问题,他们都不属于某个对象,而是属于类的。
静态成员变量定义的时候前面加static关键字,初始化必须在类外进行,前面不加static。其初始化格式如下:
<数据类型><类名>::<静态数据成员名>=<值> //静态变量的初始化
静态成员函数也是属于类的成员,不能直接引用类的非静态成员,如果静态成员函数中要引用非静态成员时,可通过对象来引用。静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);