昨天笔试的巨人的几道题,回来查了下,有些的确写错了,挂不得没有下文,基本功不行啊,这里整理了几个题,有些是自己的答案,有些是不会的网上找到的
1,一个空的类中存在多个少默认的函数?
一个空的类存在5个默认的函数
包括一个默认的构造函数,默认拷贝构造函数,析构函数,=号赋值运算符和取址运算符
class EmptyClass
{
public :
EmptyClass() ; // 默认构造函数 空的构造,带参数的自己完成
EmptyClass(const EmptyClass &) ; // 拷贝构造函数 浅拷贝 深拷贝的需要自己实现
~EmptyClass() ; // 一个空的析构函数 如果类中没有分配空间一类的可以使用默认析构,否则要自己实现析构
Empty& operator=(const Empty&) ; // 赋值运算符 这个一般也是用默认的,但是如果类比较负责一般要自己写一个
Empty* operator&() ; //取址运算符 ,这个一般都是用默认的
};
2,使用编译器编译源码需要哪几个步骤?联合编译
GCC编译C源码有四个步骤:
预处理-----> 编译 ----> 汇编 ----> 链接
现在我们就用GCC的命令选项来逐个剖析GCC过程。
1)预处理(Pre-processing)
在该阶段,编译器将C源代码中的包含的头文件如stdio.h编译进来,用户可以使用gcc的选项”-E”进行查看。
2)编译阶段(Compiling)
第二步进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
3)汇编阶段(Assembling)
汇编阶段是把编译阶段生成的”.s”文件转成二进制目标代码.
选项 -c
4)链接阶段(Link)
在成功编译之后,就进入了链接阶段。
无选项链接
用法:[root]# gcc hello.o –o hello.exe
作用:将编译输出文件hello.o链接成最终可执行文件hello.exe。
[root]# ls
hello.c hello.exe hello.i hello.o hello.s
运行该可执行文件,出现正确的结果如下。
[root@localhost Gcc]# ./hello
Hello World!
3,使用C++实现一个单例模式 设计模式不懂啊,没有怎么去接触,后悔了。
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点有以下三个
一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
网上找到的一个示例代码:
class Singleton
{
public:
~Singleton(){}
static Singleton& Instance(){return instance_;}
// testing member
protected:
Singleton(){}
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
private:
static Singleton instance_;
};
Singleton Singleton::instance_;
4,使用memset(this,0,sizeof(*this))来初始化类时会出现的问题?
自己感觉会有两个问题,
一个是sizeof的问题,sizeof计算类的空间时不计算static类型的静态成员变量的大小,如果类中存在static类型,则分配时将忽略static变量的大小。
二是虚函数指针的问题,如果类中存在虚函数,则类中会保存一个指向虚函数表的指针,如果使用memset进行初始化,会让该指针变为NULL指针,也就是无法找到虚函数表,直接导致使用虚函数时出现错误。