2020 我的 C++客户端(实习) 面试内容
巨峰网络
一、C++,联合体、结构体、枚举类的不同。
结构体:
struct NUM
{
int number;
}a;
结构体是声明只是一个模型,没有分配内存空间。当进行定义结构体变量后才分配内存空间
联合体:
union data
{
int a;
}b;
大体和结构体一样,不同之处在于,它将几个不同的变量存放在同一单元,在联合体中,各个成员变量所占内存的字节数各不相同,但都从同一个首地址开始。不管在任何时刻,只有一个变量处于活动状态。联合体所占的内存长度等于各个成员的长度之和。
enum color
{
white,black
}c;
默认状态下,每个枚举常量都对应一个整数,并从0开始,但也可指定;
二、如何一个类仅有一个实例。
1. 意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2. 动机
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机( printer spooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A / D转换器。一个会计系统只能专用于一个公司。
我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。
3. 适用性
在下面的情况下可以使用Singleton模式. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
4. 结构
5. 参与者
Singleton
定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个类操作(即Smalltalk中的一个类方法和C++中的一个静态成员函数)。可能负责创建它自己的唯一实例。
6. 协作
客户只能通过Singleton的GetInstance操作访问一个Singleton的实例。
7. 效果
Singleton模式有许多优点:
- 对唯一实例的受控访问因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
- 缩小名空间Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
- 允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
- 允许可变数目的实例这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。
- 比类操作更灵活另一种封装单件功能的方式是使用类操作(即C++中的静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改变设计以允许一个类有多个实例。
此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。
8. 实现
class Singleton
{
static std::auto_ptr<Singleton> m_pInstance;
protected:
//prevent user making our any instance by manually
//构造函数是保护类型的。
Singleton(){}
public:
~Singleton(){}
//Return this singleton class' instance pointer
static Singleton* Instance()
{
if(!m_pInstance.get())
{
m_pInstance = std::auto_ptr<Singleton>(new Singleton());
}
return m_pInstance.get();
}
};
怎样来使用它呢?不要试图从这个类派生你的单件子类,那样的结果是不妥当的,如果你需要多个单件子类,还是使用下面的宏定义更为妥当:
#define DEFINE_SINGLETON(cls)\
private:\
static std::auto_ptr<cls> m_pInstance;\
protected:\
cls(){}\
public:\
~cls(){}\
static cls* Instance(){\
if(!m_pInstance.get()){\
m_pInstance = std::auto_ptr<cls>(new cls());\
}\
return m_pInstance.get();\
}
#define IMPLEMENT_SINGLETON(cls) \
std::auto_ptr<cls> cls::m_pInstance(NULL);
假定你需要实现一个单件类YY,这样书写:
class YY
{
DEFINE_SINGLETON(YY);
public:
//your interfaces here...
};
在cpp文件中,书写:
IMPLEMENT_SINGLETON(YY);
需要引入这个类的实例的时候,使用这样的语句:
YY* pYY = YY::Instance();
这,就是全部。
如果需要定义其他的单件类,重复上面的定义,就可以了。
当想集中管理一个应用程序所需的所有配置时,可以声明一个CToolsOptions的类,其中包含配置属性集合。对于这个类的实例,显然是一个实例就够了;当编写绘图程序时,考虑绘制矩形,圆形等分别使用CGraphTool派生的工具类,每个派生类负责处理具体的绘制动作和相关的UI相应逻辑。这些工具类典型的在被用户选择工具栏的图元按钮时被选中。依照这种模式,你应该对所有的图元工具从事注册工作,使得绘图程序了解运行时刻可以使用那些图元工具。同样的,负责管理注册信息的这个管理器也只需要一个实例就行了。
三、字符串和字符数组的区别
对电脑而言只有二进制字节数组;对人脑才有字符、字符串、空字符结束符、数组、……
char c[4]={‘1’,‘2’,‘3’,’\0’};//在内存中是四个字节31 32 33 00
char s[4]=“123”;//在内存中也是四个字节31 32 33 00
int i=0x00333231;//在内存中(小端模式存储)也是四个字节31 32 33 00
人说:c是四个字符的字符数组,s是三个字符和一个结束符的字符串,i是一个十六进制整数。
电脑说:它们都是四个字节31 32 33 00,怎么解释随你。
总结: 字符数组内任意位置可写任意数据包括0x0,
而字符串只有结束的位置有一个0x0,一但有了0x0这个数据,则字符串结束。
字符数组是可以不含空字符,而不是一定。可以认为字符串是字符数组的一种特殊形式。
当然,如果是出于效率和空间的考虑,两者还是有区别的,字符串处于常量空间, 字符数组一般处于堆栈空间。
另外不管是字符串还是字符数组,反正都可以用string.h中的库函数。只是注意的是:
char *s =“string”. 这样统计出来的 strlen(s)=6. 但是存储的时候默认就在后面加了个’\0’
char s[]=“string” 这样统计出来的 strlen(s)=6. 但是存储的时候默认就在后面加了个’\0’
而 char s[]={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’};这样strlen 就不能用了。除非初始化的时候在后面加个’\0’;
所以说:单个字符初始化的时候会少用个内存单元,因为默认的没有加入’\0’…
作者:xiaqing01
来源:优快云
原文:https://blog.youkuaiyun.com/u012606764/article/details/16810103
版权声明:本文为博主原创文章,转载请附上博文链接
四、namespace既命名空间的使用。
不解释了,菜鸟教程里搜太多了。。