8.sizeof和strlen的区别?
1)sizeof是在‘编译’时就能够计算出大小,而strlen是在‘运行’时才能计算出大小。
2)sizeof是计算变量在内存中所占的内存大小(字节数),而strlen是计算字符串的长度,遇到'\0'结束。
3)若是数组,则传给sizeof不会退化,而传给strlen就会退化为指针。
4)sizeof可以计算类型,或者变量的大小,而strlen的参数必须是一个以'\0'结尾的字符串。
5)sizeof是关键字,不是一个函数,而strlen是一个函数。
9.设计一个不能被继承的类?
CParent是一个无法被继承的类。CParent类虚继承CNoHeritance类,并且CParent是CNoHeritance的朋友。同时,还有一个CChild类继承与CParent。
class CNoHeritance
{
private:
CNoHeritance(){}
~CNoHeritance(){}
friend class CParent;
};
class CParent : virtual public CNoHeritance
{
public:
CParent(int v){m_v = v;}
~CParent(){};
private:
int m_v;
public:
void fun(){cout << “The value is: ” << m_v << endl;}
};
class CChild : public CParent
{
public:
CChild():CParent(10){}
~CChild(){}
};
10.简述多态的实现机理?
多态是一个接口的多种实现,是面向对象的核心。主要是利用虚函数来进行实现的,虚函数是用virtual关键字来进行实现的,每一个存在虚函数的类中都有一个虚函数表,存放每个虚函数的地址,类的对象还有一个能够指向虚表的指针(虚指针),虚函数是运行时确定的。
11.浅谈对面向对象的认识?
面向对象强调抽象、封装、继承、多态。
抽象:在定义一个类的时候,实际上就是把一类事物中共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象。
封装:就是将类的属性包装起来,不让外界轻易的知道他的内部实现。只提供给你对外的接口让你来调用。好处可以增强模块的独立性。如设置属性或方法的访问权限(private、protected、public、默认)。
继承:就是子类从父类把它的有用的东西拿过来自己用,不用在自己去实现了。
多态:一个对象可以指向多种实际类型的现象。一个人,在不同场合下,有不同的身份,不同的状态。比如在家里,你是父母的孩子;在学校,你就是学生;在公司,你就是老板的职员。再比如在接口总定义一个run()方法,是什么在跑,汽车还是马?通过不同类的实现来表示相似的逻辑。
12.static修饰的成员变量和成员函数,const修饰的成员变量和成员函数?
static修饰的成员变量必须在类内部进行声明,在类外进行定义,而且只能定义一次。
const成员变量只是在某个对象的生存期内是常量,而对于整个类而言是可变的。一个类可以创建多个对象,每个对象的const成员变量的值是可以不同的。因此不能在类声明中初始化const成员变量(普通的const变量必须在定义的时候初始化)。const成员变量的初始化工作必须在构造函数初始化列表中进行。
static成员函数只能访问static成员变量,也只能调用其他的static成员函数。
const成员函数只能被该类的const对象调用。且不能修改成员变量,也不能调用该类中的非const成员函数。
13.malloc、calloc和realloc的区别?
char* p;
p = (char*)malloc(20);
p = (char*)calloc(20,sizeof(char));
p = (char*)realloc(p, sizeof(char)*20);(realloc是给已经分配好的空间,再次进行分配空间)
<1>malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.
<2>calloc则将初始化这部分的内存,设置为0.
<3>realloc则对malloc申请的内存进行大小的调整.